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 63 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 63 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 64 70 72 69 6e 74 ULL;.. dprint
0ff0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
1000: 20 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6e 74 /* Create cont
1010: 65 78 74 73 20 2a 2f 0a 20 20 20 20 73 77 69 74 exts */. swit
1020: 63 68 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 ch(statePtr->for
1030: 6d 61 74 20 26 20 30 78 46 46 30 29 20 7b 0a 20 mat & 0xFF0) {.
1040: 20 20 20 63 61 73 65 20 54 59 50 45 5f 4d 44 3a case TYPE_MD:
1050: 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 ..statePtr->ctx
1060: 3d 20 45 56 50 5f 4d 44 5f 43 54 58 5f 6e 65 77 = EVP_MD_CTX_new
1070: 28 29 3b 0a 09 72 65 73 20 3d 20 28 73 74 61 74 ();..res = (stat
1080: 65 50 74 72 2d 3e 63 74 78 20 21 3d 20 4e 55 4c ePtr->ctx != NUL
1090: 4c 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 L);..break;.
10a0: 63 61 73 65 20 54 59 50 45 5f 48 4d 41 43 3a 0a case TYPE_HMAC:.
10b0: 09 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 20 .statePtr->hctx
10c0: 3d 20 48 4d 41 43 5f 43 54 58 5f 6e 65 77 28 29 = HMAC_CTX_new()
10d0: 3b 0a 09 72 65 73 20 3d 20 28 73 74 61 74 65 50 ;..res = (stateP
10e0: 74 72 2d 3e 68 63 74 78 20 21 3d 20 4e 55 4c 4c tr->hctx != NULL
10f0: 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 );..break;. c
1100: 61 73 65 20 54 59 50 45 5f 43 4d 41 43 3a 0a 09 ase TYPE_CMAC:..
1110: 73 74 61 74 65 50 74 72 2d 3e 63 63 74 78 20 3d statePtr->cctx =
1120: 20 43 4d 41 43 5f 43 54 58 5f 6e 65 77 28 29 3b CMAC_CTX_new();
1130: 0a 09 72 65 73 20 3d 20 28 73 74 61 74 65 50 74 ..res = (statePt
1140: 72 2d 3e 63 63 74 78 20 21 3d 20 4e 55 4c 4c 29 r->cctx != NULL)
1150: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a ;..break;. }.
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 63 72 79 70 74 6f 67 72 tialize cryptogr
1250: 61 70 68 79 20 66 75 6e 63 74 69 6f 6e 20 2a 2f aphy function */
1260: 0a 20 20 20 20 73 77 69 74 63 68 28 73 74 61 74 . switch(stat
1270: 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 30 ePtr->format & 0
1280: 78 46 46 30 29 20 7b 0a 20 20 20 20 63 61 73 65 xFF0) {. case
1290: 20 54 59 50 45 5f 4d 44 3a 0a 09 72 65 73 20 3d TYPE_MD:..res =
12a0: 20 45 56 50 5f 44 69 67 65 73 74 49 6e 69 74 5f EVP_DigestInit_
12b0: 65 78 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 ex(statePtr->ctx
12c0: 2c 20 6d 64 2c 20 4e 55 4c 4c 29 3b 0a 09 62 72 , md, NULL);..br
12d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 59 eak;. case TY
12e0: 50 45 5f 48 4d 41 43 3a 0a 09 72 65 73 20 3d 20 PE_HMAC:..res =
12f0: 48 4d 41 43 5f 49 6e 69 74 5f 65 78 28 73 74 61 HMAC_Init_ex(sta
1300: 74 65 50 74 72 2d 3e 68 63 74 78 2c 20 28 63 6f tePtr->hctx, (co
1310: 6e 73 74 20 76 6f 69 64 20 2a 29 20 6b 65 79 2c nst void *) key,
1320: 20 6b 65 79 5f 6c 65 6e 2c 20 6d 64 2c 20 4e 55 key_len, md, NU
1330: 4c 4c 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 LL);..break;.
1340: 20 63 61 73 65 20 54 59 50 45 5f 43 4d 41 43 3a case TYPE_CMAC:
1350: 0a 09 72 65 73 20 3d 20 43 4d 41 43 5f 49 6e 69 ..res = CMAC_Ini
1360: 74 28 73 74 61 74 65 50 74 72 2d 3e 63 63 74 78 t(statePtr->cctx
1370: 2c 20 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29 , (const void *)
1380: 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 2c 20 63 key, key_len, c
1390: 69 70 68 65 72 2c 20 4e 55 4c 4c 29 3b 0a 09 62 ipher, NULL);..b
13a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 reak;. }..
13b0: 20 69 66 20 28 21 72 65 73 29 20 7b 0a 09 54 63 if (!res) {..Tc
13c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
13d0: 6e 74 65 72 70 2c 20 22 49 6e 69 74 69 61 6c 69 nterp, "Initiali
13e0: 7a 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45 ze failed: ", RE
13f0: 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 ASON(), NULL);..
1400: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
1410: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 ;. }. retu
1420: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a rn TCL_OK;.}../*
1430: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
1440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1450: 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 0a 20 2a 0a 20 2a 20 44 69 67 ------. *. * Dig
1480: 65 73 74 55 70 64 61 74 65 20 2d 2d 0a 20 2a 0a estUpdate --. *.
1490: 20 2a 09 55 70 64 61 74 65 20 61 20 68 61 73 68 *.Update a hash
14a0: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 64 function with d
14b0: 61 74 61 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e ata. *. * Return
14c0: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 s:. *.TCL_OK if
14d0: 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 54 43 successful or TC
14e0: 4c 5f 45 52 52 4f 52 20 66 6f 72 20 66 61 69 6c L_ERROR for fail
14f0: 75 72 65 20 77 69 74 68 20 72 65 73 75 6c 74 20 ure with result
1500: 73 65 74 0a 20 2a 09 74 6f 20 65 72 72 6f 72 20 set. *.to error
1510: 6d 65 73 73 61 67 65 20 69 66 20 64 6f 5f 72 65 message if do_re
1520: 73 75 6c 74 20 69 73 20 74 72 75 65 2e 0a 20 2a sult is true.. *
1530: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
1540: 3a 0a 20 2a 09 41 64 64 73 20 62 75 66 20 64 61 :. *.Adds buf da
1550: 74 61 20 74 6f 20 68 61 73 68 20 66 75 6e 63 74 ta to hash funct
1560: 69 6f 6e 20 6f 72 20 73 65 74 73 20 72 65 73 75 ion or sets resu
1570: 6c 74 20 74 6f 20 65 72 72 6f 72 20 6d 65 73 73 lt to error mess
1580: 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d age. *. *-------
1590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
15d0: 0a 69 6e 74 20 44 69 67 65 73 74 55 70 64 61 74 .int DigestUpdat
15e0: 65 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 e(DigestState *s
15f0: 74 61 74 65 50 74 72 2c 20 63 68 61 72 20 2a 62 tatePtr, char *b
1600: 75 66 2c 20 73 69 7a 65 5f 74 20 72 65 61 64 2c uf, size_t read,
1610: 20 69 6e 74 20 64 6f 5f 72 65 73 75 6c 74 29 20 int do_result)
1620: 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 {. int res =
1630: 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 0;.. dprintf(
1640: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
1650: 73 77 69 74 63 68 28 73 74 61 74 65 50 74 72 2d switch(statePtr-
1660: 3e 66 6f 72 6d 61 74 20 26 20 30 78 46 46 30 29 >format & 0xFF0)
1670: 20 7b 0a 20 20 20 20 63 61 73 65 20 54 59 50 45 {. case TYPE
1680: 5f 4d 44 3a 0a 20 20 20 20 20 20 20 20 72 65 73 _MD:. res
1690: 20 3d 20 45 56 50 5f 44 69 67 65 73 74 55 70 64 = EVP_DigestUpd
16a0: 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 ate(statePtr->ct
16b0: 78 2c 20 62 75 66 2c 20 72 65 61 64 29 3b 0a 09 x, buf, read);..
16c0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 break;. case
16d0: 54 59 50 45 5f 48 4d 41 43 3a 0a 20 20 20 20 20 TYPE_HMAC:.
16e0: 20 20 20 72 65 73 20 3d 20 48 4d 41 43 5f 55 70 res = HMAC_Up
16f0: 64 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 68 date(statePtr->h
1700: 63 74 78 2c 20 62 75 66 2c 20 72 65 61 64 29 3b ctx, buf, read);
1710: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 ..break;. cas
1720: 65 20 54 59 50 45 5f 43 4d 41 43 3a 0a 20 20 20 e TYPE_CMAC:.
1730: 20 20 20 20 20 72 65 73 20 3d 20 43 4d 41 43 5f res = CMAC_
1740: 55 70 64 61 74 65 28 73 74 61 74 65 50 74 72 2d Update(statePtr-
1750: 3e 63 63 74 78 2c 20 62 75 66 2c 20 72 65 61 64 >cctx, buf, read
1760: 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d );..break;. }
1770: 0a 0a 20 20 20 20 69 66 20 28 21 72 65 73 20 26 .. if (!res &
1780: 26 20 64 6f 5f 72 65 73 75 6c 74 29 20 7b 0a 09 & do_result) {..
1790: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
17a0: 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 (statePtr->inter
17b0: 70 2c 20 22 55 70 64 61 74 65 20 66 61 69 6c 65 p, "Update faile
17c0: 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 d: ", REASON(),
17d0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
17e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
17f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
1800: 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d K;.}../*. *-----
1810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
1850: 2a 0a 20 2a 20 44 69 67 65 73 74 46 69 6e 61 6c *. * DigestFinal
1860: 69 7a 65 20 2d 2d 0a 20 2a 0a 20 2a 09 46 69 6e ize --. *. *.Fin
1870: 61 6c 69 7a 65 20 61 20 68 61 73 68 20 66 75 6e alize a hash fun
1880: 63 74 69 6f 6e 20 61 6e 64 20 72 65 74 75 72 6e ction and return
1890: 20 74 68 65 20 6d 65 73 73 61 67 65 20 64 69 67 the message dig
18a0: 65 73 74 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e est. *. * Return
18b0: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 s:. *.TCL_OK if
18c0: 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 54 43 successful or TC
18d0: 4c 5f 45 52 52 4f 52 20 66 6f 72 20 66 61 69 6c L_ERROR for fail
18e0: 75 72 65 20 77 69 74 68 20 72 65 73 75 6c 74 20 ure with result
18f0: 73 65 74 0a 20 2a 09 74 6f 20 65 72 72 6f 72 20 set. *.to error
1900: 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 20 53 message.. *. * S
1910: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
1920: 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 6d Sets result to m
1930: 65 73 73 61 67 65 20 64 69 67 65 73 74 20 6f 72 essage digest or
1940: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 an error messag
1950: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
1960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
19a0: 69 6e 74 20 44 69 67 65 73 74 46 69 6e 61 6c 69 int DigestFinali
19b0: 7a 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 ze(Tcl_Interp *i
19c0: 6e 74 65 72 70 2c 20 44 69 67 65 73 74 53 74 61 nterp, DigestSta
19d0: 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 54 63 te *statePtr, Tc
19e0: 6c 5f 4f 62 6a 20 2a 2a 72 65 73 75 6c 74 4f 62 l_Obj **resultOb
19f0: 6a 29 20 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 j) {. unsigne
1a00: 64 20 63 68 61 72 20 6d 64 5f 62 75 66 5b 45 56 d char md_buf[EV
1a10: 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 5d 3b 0a P_MAX_MD_SIZE];.
1a20: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 unsigned int
1a30: 20 75 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 72 ulen;. int r
1a40: 65 73 20 3d 20 30 2c 20 6d 64 5f 6c 65 6e 20 3d es = 0, md_len =
1a50: 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 0;.. dprintf
1a60: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
1a70: 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 63 72 79 /* Finalize cry
1a80: 70 74 6f 67 72 61 70 68 79 20 66 75 6e 63 74 69 ptography functi
1a90: 6f 6e 20 61 6e 64 20 67 65 74 20 72 65 73 75 6c on and get resul
1aa0: 74 20 2a 2f 0a 20 20 20 20 73 77 69 74 63 68 28 t */. switch(
1ab0: 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 statePtr->format
1ac0: 20 26 20 30 78 46 46 30 29 20 7b 0a 20 20 20 20 & 0xFF0) {.
1ad0: 63 61 73 65 20 54 59 50 45 5f 4d 44 3a 0a 09 69 case TYPE_MD:..i
1ae0: 66 20 28 21 28 73 74 61 74 65 50 74 72 2d 3e 66 f (!(statePtr->f
1af0: 6f 72 6d 61 74 20 26 20 49 53 5f 58 4f 46 29 29 ormat & IS_XOF))
1b00: 20 7b 0a 09 20 20 20 20 72 65 73 20 3d 20 45 56 {.. res = EV
1b10: 50 5f 44 69 67 65 73 74 46 69 6e 61 6c 5f 65 78 P_DigestFinal_ex
1b20: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
1b30: 6d 64 5f 62 75 66 2c 20 26 75 6c 65 6e 29 3b 0a md_buf, &ulen);.
1b40: 09 20 20 20 20 6d 64 5f 6c 65 6e 20 3d 20 28 69 . md_len = (i
1b50: 6e 74 29 20 75 6c 65 6e 3b 0a 09 7d 20 65 6c 73 nt) ulen;..} els
1b60: 65 20 7b 0a 09 20 20 20 20 72 65 73 20 3d 20 45 e {.. res = E
1b70: 56 50 5f 44 69 67 65 73 74 46 69 6e 61 6c 58 4f VP_DigestFinalXO
1b80: 46 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c F(statePtr->ctx,
1b90: 20 6d 64 5f 62 75 66 2c 20 28 73 69 7a 65 5f 74 md_buf, (size_t
1ba0: 29 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a ) EVP_MAX_MD_SIZ
1bb0: 45 29 3b 0a 09 20 20 20 20 6d 64 5f 6c 65 6e 20 E);.. md_len
1bc0: 3d 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a = EVP_MAX_MD_SIZ
1bd0: 45 3b 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 E;..}..break;.
1be0: 20 20 63 61 73 65 20 54 59 50 45 5f 48 4d 41 43 case TYPE_HMAC
1bf0: 3a 0a 09 72 65 73 20 3d 20 48 4d 41 43 5f 46 69 :..res = HMAC_Fi
1c00: 6e 61 6c 28 73 74 61 74 65 50 74 72 2d 3e 68 63 nal(statePtr->hc
1c10: 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26 75 6c 65 tx, md_buf, &ule
1c20: 6e 29 3b 0a 09 6d 64 5f 6c 65 6e 20 3d 20 28 69 n);..md_len = (i
1c30: 6e 74 29 20 75 6c 65 6e 3b 0a 09 62 72 65 61 6b nt) ulen;..break
1c40: 3b 0a 20 20 20 20 63 61 73 65 20 54 59 50 45 5f ;. case TYPE_
1c50: 43 4d 41 43 3a 0a 09 73 69 7a 65 5f 74 20 73 69 CMAC:..size_t si
1c60: 7a 65 3b 0a 09 72 65 73 20 3d 20 43 4d 41 43 5f ze;..res = CMAC_
1c70: 46 69 6e 61 6c 28 73 74 61 74 65 50 74 72 2d 3e Final(statePtr->
1c80: 63 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26 73 cctx, md_buf, &s
1c90: 69 7a 65 29 3b 0a 09 6d 64 5f 6c 65 6e 20 3d 20 ize);..md_len =
1ca0: 28 69 6e 74 29 20 73 69 7a 65 3b 0a 09 62 72 65 (int) size;..bre
1cb0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 ak;. }.. i
1cc0: 66 20 28 21 72 65 73 29 20 7b 0a 09 69 66 20 28 f (!res) {..if (
1cd0: 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c resultObj == NUL
1ce0: 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 L) {.. Tcl_Ap
1cf0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
1d00: 70 2c 20 22 46 69 6e 61 6c 69 7a 65 20 66 61 69 p, "Finalize fai
1d10: 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 led: ", REASON()
1d20: 2c 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 72 65 74 , NULL);..}..ret
1d30: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
1d40: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 74 }.. /* Ret
1d50: 75 72 6e 20 6d 65 73 73 61 67 65 20 64 69 67 65 urn message dige
1d60: 73 74 20 61 73 20 65 69 74 68 65 72 20 61 20 62 st as either a b
1d70: 69 6e 61 72 79 20 6f 72 20 68 65 78 20 73 74 72 inary or hex str
1d80: 69 6e 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 ing */. if (s
1d90: 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 tatePtr->format
1da0: 26 20 42 49 4e 5f 46 4f 52 4d 41 54 29 20 7b 0a & BIN_FORMAT) {.
1db0: 09 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d .if (resultObj =
1dc0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 = NULL) {.. T
1dd0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
1de0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 interp, Tcl_NewB
1df0: 79 74 65 41 72 72 61 79 4f 62 6a 28 6d 64 5f 62 yteArrayObj(md_b
1e00: 75 66 2c 20 6d 64 5f 6c 65 6e 29 29 3b 0a 09 7d uf, md_len));..}
1e10: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 2a 72 65 else {.. *re
1e20: 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 sultObj = Tcl_Ne
1e30: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 6d 64 wByteArrayObj(md
1e40: 5f 62 75 66 2c 20 6d 64 5f 6c 65 6e 29 3b 0a 09 _buf, md_len);..
1e50: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
1e60: 6f 75 6e 74 28 2a 72 65 73 75 6c 74 4f 62 6a 29 ount(*resultObj)
1e70: 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 65 6c 73 65 ;..}.. } else
1e80: 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6e 65 77 {..Tcl_Obj *new
1e90: 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a Obj = Tcl_NewObj
1ea0: 28 29 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 ();..unsigned ch
1eb0: 61 72 20 2a 70 74 72 20 3d 20 54 63 6c 5f 53 65 ar *ptr = Tcl_Se
1ec0: 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68 tByteArrayLength
1ed0: 28 6e 65 77 4f 62 6a 2c 20 6d 64 5f 6c 65 6e 2a (newObj, md_len*
1ee0: 32 29 3b 0a 0a 09 66 6f 72 20 28 69 6e 74 20 69 2);...for (int i
1ef0: 20 3d 20 30 3b 20 69 20 3c 20 6d 64 5f 6c 65 6e = 0; i < md_len
1f00: 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 2a 70 ; i++) {.. *p
1f10: 74 72 2b 2b 20 3d 20 68 65 78 5b 28 6d 64 5f 62 tr++ = hex[(md_b
1f20: 75 66 5b 69 5d 20 3e 3e 20 34 29 20 26 20 30 78 uf[i] >> 4) & 0x
1f30: 30 46 5d 3b 0a 09 20 20 20 20 2a 70 74 72 2b 2b 0F];.. *ptr++
1f40: 20 3d 20 68 65 78 5b 6d 64 5f 62 75 66 5b 69 5d = hex[md_buf[i]
1f50: 20 26 20 30 78 30 46 5d 3b 0a 09 7d 0a 0a 09 69 & 0x0F];..}...i
1f60: 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 f (resultObj ==
1f70: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c NULL) {.. Tcl
1f80: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
1f90: 74 65 72 70 2c 20 6e 65 77 4f 62 6a 29 3b 0a 09 terp, newObj);..
1fa0: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 2a 72 } else {.. *r
1fb0: 65 73 75 6c 74 4f 62 6a 20 3d 20 6e 65 77 4f 62 esultObj = newOb
1fc0: 6a 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 j;.. Tcl_Incr
1fd0: 52 65 66 43 6f 75 6e 74 28 2a 72 65 73 75 6c 74 RefCount(*result
1fe0: 4f 62 6a 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 Obj);..}. }.
1ff0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
2000: 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ;.}../**********
2010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2040: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 *********/../*.
2050: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
2060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2090: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 ----. *. * Diges
20a0: 74 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 2d tBlockModeProc -
20b0: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e -. *. *.This fun
20c0: 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 ction is invoked
20d0: 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 by the generic
20e0: 49 4f 20 6c 65 76 65 6c 0a 20 2a 09 74 6f 20 73 IO level. *.to s
20f0: 65 74 20 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 20 et blocking and
2100: 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 nonblocking mode
2110: 73 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 s.. *. * Returns
2120: 3a 0a 20 2a 09 30 20 69 66 20 73 75 63 63 65 73 :. *.0 if succes
2130: 73 66 75 6c 20 6f 72 20 50 4f 53 49 58 20 65 72 sful or POSIX er
2140: 72 6f 72 20 63 6f 64 65 20 69 66 20 66 61 69 6c ror code if fail
2150: 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ed.. *. * Side e
2160: 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 ffects:. *.Sets
2170: 74 68 65 20 64 65 76 69 63 65 20 69 6e 74 6f 20 the device into
2180: 62 6c 6f 63 6b 69 6e 67 20 6f 72 20 6e 6f 6e 62 blocking or nonb
2190: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 2a locking mode.. *
21a0: 09 43 61 6e 20 63 61 6c 6c 20 54 63 6c 5f 53 65 .Can call Tcl_Se
21b0: 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72 2e 0a 20 tChannelError..
21c0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
21d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2200: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
2210: 69 63 20 69 6e 74 20 44 69 67 65 73 74 42 6c 6f ic int DigestBlo
2220: 63 6b 4d 6f 64 65 50 72 6f 63 28 43 6c 69 65 6e ckModeProc(Clien
2230: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
2240: 2c 20 69 6e 74 20 6d 6f 64 65 29 20 7b 0a 20 20 , int mode) {.
2250: 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 DigestState *s
2260: 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 tatePtr = (Diges
2270: 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 tState *) client
2280: 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 28 6d Data;.. if (m
2290: 6f 64 65 20 3d 3d 20 54 43 4c 5f 4d 4f 44 45 5f ode == TCL_MODE_
22a0: 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29 20 7b 0a 09 NONBLOCKING) {..
22b0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
22c0: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 |= TLS_TCL_ASYNC
22d0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
22e0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
22f0: 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 41 53 59 &= ~(TLS_TCL_ASY
2300: 4e 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 NC);. }. r
2310: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 eturn 0;.}../*.
2320: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
2330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2360: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 ----. *. * Diges
2370: 74 43 6c 6f 73 65 50 72 6f 63 20 2d 2d 0a 20 2a tCloseProc --. *
2380: 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f . *.This functio
2390: 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 n is invoked by
23a0: 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c the generic IO l
23b0: 65 76 65 6c 20 74 6f 20 70 65 72 66 6f 72 6d 0a evel to perform.
23c0: 20 2a 09 63 68 61 6e 6e 65 6c 2d 74 79 70 65 20 *.channel-type
23d0: 73 70 65 63 69 66 69 63 20 63 6c 65 61 6e 75 70 specific cleanup
23e0: 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 6e 65 when the channe
23f0: 6c 20 69 73 20 63 6c 6f 73 65 64 2e 20 41 6c 6c l is closed. All
2400: 0a 20 2a 09 71 75 65 75 65 64 20 6f 75 74 70 75 . *.queued outpu
2410: 74 20 69 73 20 66 6c 75 73 68 65 64 20 70 72 69 t is flushed pri
2420: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 or to calling th
2430: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a is function.. *.
2440: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 30 * Returns:. *.0
2450: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f if successful o
2460: 72 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63 6f r POSIX error co
2470: 64 65 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a de if failed.. *
2480: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
2490: 3a 0a 20 2a 09 44 65 6c 65 74 65 73 20 73 74 6f :. *.Deletes sto
24a0: 72 65 64 20 73 74 61 74 65 20 64 61 74 61 2e 0a red state data..
24b0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
24c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24f0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 --------. */.int
2500: 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 DigestCloseProc
2510: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
2520: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
2530: 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 rp *interp) {.
2540: 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 DigestState *s
2550: 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 tatePtr = (Diges
2560: 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 tState *) client
2570: 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 Data;.. /* Ca
2580: 6e 63 65 6c 20 61 63 74 69 76 65 20 74 69 6d 65 ncel active time
2590: 72 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 20 r, if any */.
25a0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 if (statePtr->t
25b0: 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d imer != (Tcl_Tim
25c0: 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b erToken) NULL) {
25d0: 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 ..Tcl_DeleteTime
25e0: 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 rHandler(statePt
25f0: 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 r->timer);..stat
2600: 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 ePtr->timer = (T
2610: 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e cl_TimerToken) N
2620: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
2630: 2f 2a 20 4f 75 74 70 75 74 20 6d 65 73 73 61 67 /* Output messag
2640: 65 20 64 69 67 65 73 74 20 69 66 20 6e 6f 74 20 e digest if not
2650: 61 6c 72 65 61 64 79 20 64 6f 6e 65 20 2a 2f 0a already done */.
2660: 20 20 20 20 69 66 20 28 21 28 73 74 61 74 65 50 if (!(stateP
2670: 74 72 2d 3e 66 6c 61 67 73 20 26 20 43 48 41 4e tr->flags & CHAN
2680: 5f 45 4f 46 29 29 20 7b 0a 09 54 63 6c 5f 43 68 _EOF)) {..Tcl_Ch
2690: 61 6e 6e 65 6c 20 70 61 72 65 6e 74 20 3d 20 54 annel parent = T
26a0: 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 cl_GetStackedCha
26b0: 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 nnel(statePtr->s
26c0: 65 6c 66 29 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a elf);..Tcl_Obj *
26d0: 72 65 73 75 6c 74 4f 62 6a 3b 0a 09 69 6e 74 20 resultObj;..int
26e0: 77 72 69 74 74 65 6e 3b 0a 0a 09 69 66 20 28 44 written;...if (D
26f0: 69 67 65 73 74 46 69 6e 61 6c 69 7a 65 28 73 74 igestFinalize(st
2700: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 atePtr->interp,
2710: 73 74 61 74 65 50 74 72 2c 20 26 72 65 73 75 6c statePtr, &resul
2720: 74 4f 62 6a 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 tObj) == TCL_OK)
2730: 20 7b 0a 09 20 20 20 20 75 6e 73 69 67 6e 65 64 {.. unsigned
2740: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 54 63 char *data = Tc
2750: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 l_GetByteArrayFr
2760: 6f 6d 4f 62 6a 28 72 65 73 75 6c 74 4f 62 6a 2c omObj(resultObj,
2770: 20 26 77 72 69 74 74 65 6e 29 3b 0a 09 20 20 20 &written);..
2780: 20 54 63 6c 5f 57 72 69 74 65 52 61 77 28 70 61 Tcl_WriteRaw(pa
2790: 72 65 6e 74 2c 20 64 61 74 61 2c 20 77 72 69 74 rent, data, writ
27a0: 74 65 6e 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 ten);.. Tcl_D
27b0: 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 75 ecrRefCount(resu
27c0: 6c 74 4f 62 6a 29 3b 0a 09 7d 0a 09 73 74 61 74 ltObj);..}..stat
27d0: 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 ePtr->flags |= C
27e0: 48 41 4e 5f 45 4f 46 3b 0a 20 20 20 20 7d 0a 0a HAN_EOF;. }..
27f0: 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20 /* Clean-up
2800: 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 */. DigestSta
2810: 74 65 46 72 65 65 28 73 74 61 74 65 50 74 72 29 teFree(statePtr)
2820: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a ;. return 0;.
2830: 7d 0a 0a 2f 2a 0a 20 2a 20 53 61 6d 65 20 61 73 }../*. * Same as
2840: 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 DigestCloseProc
2850: 20 62 75 74 20 77 69 74 68 20 69 6e 64 69 76 69 but with indivi
2860: 64 75 61 6c 20 72 65 61 64 20 61 6e 64 20 77 72 dual read and wr
2870: 69 74 65 20 63 6c 6f 73 65 20 63 6f 6e 74 72 6f ite close contro
2880: 6c 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 l. */.static int
2890: 20 44 69 67 65 73 74 43 6c 6f 73 65 32 50 72 6f DigestClose2Pro
28a0: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 c(ClientData ins
28b0: 74 61 6e 63 65 44 61 74 61 2c 20 54 63 6c 5f 49 tanceData, Tcl_I
28c0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
28d0: 6e 74 20 66 6c 61 67 73 29 20 7b 0a 0a 20 20 20 nt flags) {..
28e0: 20 69 66 20 28 28 66 6c 61 67 73 20 26 20 28 54 if ((flags & (T
28f0: 43 4c 5f 43 4c 4f 53 45 5f 52 45 41 44 20 7c 20 CL_CLOSE_READ |
2900: 54 43 4c 5f 43 4c 4f 53 45 5f 57 52 49 54 45 29 TCL_CLOSE_WRITE)
2910: 29 20 3d 3d 20 30 29 20 7b 0a 09 72 65 74 75 72 ) == 0) {..retur
2920: 6e 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f n DigestClosePro
2930: 63 28 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 c(instanceData,
2940: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a 20 interp);. }.
2950: 20 20 20 72 65 74 75 72 6e 20 45 49 4e 56 41 4c return EINVAL
2960: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ;.}../*. *------
2970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
29a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
29b0: 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 49 6e 70 . *. * DigestInp
29c0: 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 utProc --. *. *.
29d0: 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 Called by the ge
29e0: 6e 65 72 69 63 20 49 4f 20 73 79 73 74 65 6d 20 neric IO system
29f0: 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 72 6f to read data fro
2a00: 6d 20 74 72 61 6e 73 66 6f 72 6d 20 61 6e 64 0a m transform and.
2a10: 20 2a 09 70 6c 61 63 65 20 69 6e 20 62 75 66 2e *.place in buf.
2a20: 20 54 72 61 6e 73 66 6f 72 6d 20 67 65 74 73 20 Transform gets
2a30: 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 75 6e data from the un
2a40: 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c derlying channel
2a50: 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a .. *. * Returns:
2a60: 0a 20 2a 09 54 6f 74 61 6c 20 62 79 74 65 73 20 . *.Total bytes
2a70: 72 65 61 64 20 6f 72 20 2d 31 20 66 6f 72 20 61 read or -1 for a
2a80: 6e 20 65 72 72 6f 72 20 61 6c 6f 6e 67 20 77 69 n error along wi
2a90: 74 68 20 61 20 50 4f 53 49 58 20 65 72 72 6f 72 th a POSIX error
2aa0: 0a 20 2a 09 63 6f 64 65 20 69 6e 20 65 72 72 6f . *.code in erro
2ab0: 72 43 6f 64 65 50 74 72 2e 20 55 73 65 20 45 41 rCodePtr. Use EA
2ac0: 47 41 49 4e 20 66 6f 72 20 6e 6f 6e 62 6c 6f 63 GAIN for nonbloc
2ad0: 6b 69 6e 67 20 61 6e 64 20 6e 6f 20 64 61 74 61 king and no data
2ae0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
2af0: 65 63 74 73 3a 0a 20 2a 09 52 65 61 64 20 64 61 ects:. *.Read da
2b00: 74 61 20 66 72 6f 6d 20 74 72 61 6e 73 66 6f 72 ta from transfor
2b10: 6d 20 61 6e 64 20 77 72 69 74 65 20 74 6f 20 62 m and write to b
2b20: 75 66 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d uf. *. *--------
2b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
2b70: 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 49 6e 70 */.int DigestInp
2b80: 75 74 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 utProc(ClientDat
2b90: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 63 68 a clientData, ch
2ba0: 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 74 6f 52 ar *buf, int toR
2bb0: 65 61 64 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 ead, int *errorC
2bc0: 6f 64 65 50 74 72 29 20 7b 0a 20 20 20 20 44 69 odePtr) {. Di
2bd0: 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 gestState *state
2be0: 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 Ptr = (DigestSta
2bf0: 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 te *) clientData
2c00: 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 ;. Tcl_Channe
2c10: 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 69 6e l parent;. in
2c20: 74 20 72 65 61 64 3b 0a 20 20 20 20 2a 65 72 72 t read;. *err
2c30: 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a orCodePtr = 0;..
2c40: 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 20 /* Abort if
2c50: 6e 6f 74 68 69 6e 67 20 74 6f 20 70 72 6f 63 65 nothing to proce
2c60: 73 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 74 6f ss */. if (to
2c70: 52 65 61 64 20 3c 3d 20 30 20 7c 7c 20 73 74 61 Read <= 0 || sta
2c80: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 tePtr->self == (
2c90: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
2ca0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a L) {..return 0;.
2cb0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 }.. /* Ge
2cc0: 74 20 62 79 74 65 73 20 66 72 6f 6d 20 75 6e 64 t bytes from und
2cd0: 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 20 erlying channel
2ce0: 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 20 3d 20 */. parent =
2cf0: 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68 Tcl_GetStackedCh
2d00: 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e annel(statePtr->
2d10: 73 65 6c 66 29 3b 0a 20 20 20 20 72 65 61 64 20 self);. read
2d20: 3d 20 54 63 6c 5f 52 65 61 64 52 61 77 28 70 61 = Tcl_ReadRaw(pa
2d30: 72 65 6e 74 2c 20 62 75 66 2c 20 74 6f 52 65 61 rent, buf, toRea
2d40: 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 d);.. /* Upda
2d50: 74 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e te hash function
2d60: 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 61 64 */. if (read
2d70: 20 3e 20 30 29 20 7b 0a 09 2f 2a 20 48 61 76 65 > 0) {../* Have
2d80: 20 64 61 74 61 20 2a 2f 0a 09 69 66 20 28 44 69 data */..if (Di
2d90: 67 65 73 74 55 70 64 61 74 65 28 73 74 61 74 65 gestUpdate(state
2da0: 50 74 72 2c 20 62 75 66 2c 20 28 73 69 7a 65 5f Ptr, buf, (size_
2db0: 74 29 20 72 65 61 64 2c 20 30 29 20 21 3d 20 54 t) read, 0) != T
2dc0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 CL_OK) {.. Tc
2dd0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f l_SetChannelErro
2de0: 72 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 r(statePtr->self
2df0: 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 , Tcl_ObjPrintf(
2e00: 22 55 70 64 61 74 65 20 66 61 69 6c 65 64 3a 20 "Update failed:
2e10: 25 73 22 2c 20 52 45 41 53 4f 4e 28 29 29 29 3b %s", REASON()));
2e20: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 .. *errorCode
2e30: 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 20 Ptr = EINVAL;..
2e40: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 7d 0a return 0;..}.
2e50: 09 2f 2a 20 54 68 69 73 20 69 73 20 63 6f 72 72 ./* This is corr
2e60: 65 63 74 20 2a 2f 0a 09 72 65 61 64 20 3d 20 2d ect */..read = -
2e70: 31 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 1;..*errorCodePt
2e80: 72 20 3d 20 45 41 47 41 49 4e 3b 0a 0a 20 20 20 r = EAGAIN;..
2e90: 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 61 64 } else if (read
2ea0: 20 3c 20 30 29 20 7b 0a 09 2f 2a 20 45 72 72 6f < 0) {../* Erro
2eb0: 72 20 2a 2f 0a 09 2a 65 72 72 6f 72 43 6f 64 65 r */..*errorCode
2ec0: 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 Ptr = Tcl_GetErr
2ed0: 6e 6f 28 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 no();.. } els
2ee0: 65 20 69 66 20 28 21 28 73 74 61 74 65 50 74 72 e if (!(statePtr
2ef0: 2d 3e 66 6c 61 67 73 20 26 20 43 48 41 4e 5f 45 ->flags & CHAN_E
2f00: 4f 46 29 29 20 7b 0a 09 2f 2a 20 45 4f 46 20 2a OF)) {../* EOF *
2f10: 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 /..Tcl_Obj *resu
2f20: 6c 74 4f 62 6a 3b 0a 09 69 66 20 28 44 69 67 65 ltObj;..if (Dige
2f30: 73 74 46 69 6e 61 6c 69 7a 65 28 73 74 61 74 65 stFinalize(state
2f40: 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 73 74 61 Ptr->interp, sta
2f50: 74 65 50 74 72 2c 20 26 72 65 73 75 6c 74 4f 62 tePtr, &resultOb
2f60: 6a 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a j) == TCL_OK) {.
2f70: 09 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 . unsigned ch
2f80: 61 72 20 2a 64 61 74 61 20 3d 20 54 63 6c 5f 47 ar *data = Tcl_G
2f90: 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f etByteArrayFromO
2fa0: 62 6a 28 72 65 73 75 6c 74 4f 62 6a 2c 20 26 72 bj(resultObj, &r
2fb0: 65 61 64 29 3b 0a 09 20 20 20 20 6d 65 6d 63 70 ead);.. memcp
2fc0: 79 28 62 75 66 2c 20 64 61 74 61 2c 20 72 65 61 y(buf, data, rea
2fd0: 64 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 d);.. Tcl_Dec
2fe0: 72 52 65 66 43 6f 75 6e 74 28 72 65 73 75 6c 74 rRefCount(result
2ff0: 4f 62 6a 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b Obj);...} else {
3000: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 .. Tcl_SetCha
3010: 6e 6e 65 6c 45 72 72 6f 72 28 73 74 61 74 65 50 nnelError(stateP
3020: 74 72 2d 3e 73 65 6c 66 2c 20 54 63 6c 5f 4f 62 tr->self, Tcl_Ob
3030: 6a 50 72 69 6e 74 66 28 22 46 69 6e 61 6c 69 7a jPrintf("Finaliz
3040: 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 52 e failed: %s", R
3050: 45 41 53 4f 4e 28 29 29 29 3b 0a 09 20 20 20 20 EASON()));..
3060: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
3070: 45 49 4e 56 41 4c 3b 0a 09 20 20 20 20 72 65 61 EINVAL;.. rea
3080: 64 20 3d 20 30 3b 0a 09 7d 0a 09 73 74 61 74 65 d = 0;..}..state
3090: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 48 Ptr->flags |= CH
30a0: 41 4e 5f 45 4f 46 3b 0a 20 20 20 20 7d 0a 20 20 AN_EOF;. }.
30b0: 20 20 72 65 74 75 72 6e 20 72 65 61 64 3b 0a 7d return read;.}
30c0: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
30d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
30e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
3110: 0a 20 2a 20 44 69 67 65 73 74 4f 75 74 70 75 74 . * DigestOutput
3120: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 Proc --. *. *.Ca
3130: 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 lled by the gene
3140: 72 69 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f ric IO system to
3150: 20 77 72 69 74 65 20 64 61 74 61 20 69 6e 20 62 write data in b
3160: 75 66 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 2e uf to transform.
3170: 0a 20 2a 09 54 68 65 20 74 72 61 6e 73 66 6f 72 . *.The transfor
3180: 6d 20 77 72 69 74 65 73 20 74 68 65 20 72 65 73 m writes the res
3190: 75 6c 74 20 74 6f 20 74 68 65 20 75 6e 64 65 72 ult to the under
31a0: 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 0a 20 lying channel..
31b0: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a *. * Returns:. *
31c0: 09 54 6f 74 61 6c 20 62 79 74 65 73 20 77 72 69 .Total bytes wri
31d0: 74 74 65 6e 20 6f 72 20 2d 31 20 66 6f 72 20 61 tten or -1 for a
31e0: 6e 20 65 72 72 6f 72 20 61 6c 6f 6e 67 20 77 69 n error along wi
31f0: 74 68 20 61 20 50 4f 53 49 58 20 65 72 72 6f 72 th a POSIX error
3200: 0a 20 2a 09 63 6f 64 65 20 69 6e 20 65 72 72 6f . *.code in erro
3210: 72 43 6f 64 65 50 74 72 2e 20 55 73 65 20 45 41 rCodePtr. Use EA
3220: 47 41 49 4e 20 66 6f 72 20 6e 6f 6e 62 6c 6f 63 GAIN for nonbloc
3230: 6b 69 6e 67 20 61 6e 64 20 63 61 6e 27 74 20 77 king and can't w
3240: 72 69 74 65 20 64 61 74 61 2e 0a 20 2a 0a 20 2a rite data.. *. *
3250: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
3260: 2a 09 47 65 74 20 64 61 74 61 20 66 72 6f 6d 20 *.Get data from
3270: 62 75 66 20 61 6e 64 20 75 70 64 61 74 65 20 64 buf and update d
3280: 69 67 65 73 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d igest. *. *-----
3290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
32a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
32b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
32c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
32d0: 2d 0a 20 2a 2f 0a 20 69 6e 74 20 44 69 67 65 73 -. */. int Diges
32e0: 74 4f 75 74 70 75 74 50 72 6f 63 28 43 6c 69 65 tOutputProc(Clie
32f0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
3300: 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 62 a, const char *b
3310: 75 66 2c 20 69 6e 74 20 74 6f 57 72 69 74 65 2c uf, int toWrite,
3320: 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 int *errorCodeP
3330: 74 72 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 tr) {. Digest
3340: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
3350: 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a = (DigestState *
3360: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 ) clientData;.
3370: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 *errorCodePtr
3380: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f = 0;.. /* Abo
3390: 72 74 20 69 66 20 6e 6f 74 68 69 6e 67 20 74 6f rt if nothing to
33a0: 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 20 20 process */.
33b0: 69 66 20 28 74 6f 57 72 69 74 65 20 3c 3d 20 30 if (toWrite <= 0
33c0: 20 7c 7c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 || statePtr->se
33d0: 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e lf == (Tcl_Chann
33e0: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 el) NULL) {..ret
33f0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 urn 0;. }..
3400: 20 20 2f 2a 20 55 70 64 61 74 65 20 68 61 73 68 /* Update hash
3410: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 function */.
3420: 20 69 66 20 28 74 6f 57 72 69 74 65 20 3e 20 30 if (toWrite > 0
3430: 20 26 26 20 44 69 67 65 73 74 55 70 64 61 74 65 && DigestUpdate
3440: 28 73 74 61 74 65 50 74 72 2c 20 62 75 66 2c 20 (statePtr, buf,
3450: 28 73 69 7a 65 5f 74 29 20 74 6f 57 72 69 74 65 (size_t) toWrite
3460: 2c 20 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 , 0) != TCL_OK)
3470: 7b 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 {..Tcl_SetChanne
3480: 6c 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d lError(statePtr-
3490: 3e 73 65 6c 66 2c 20 54 63 6c 5f 4f 62 6a 50 72 >self, Tcl_ObjPr
34a0: 69 6e 74 66 28 22 55 70 64 61 74 65 20 66 61 69 intf("Update fai
34b0: 6c 65 64 3a 20 25 73 22 2c 20 52 45 41 53 4f 4e led: %s", REASON
34c0: 28 29 29 29 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 ()));..*errorCod
34d0: 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 ePtr = EINVAL;..
34e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a return 0;. }.
34f0: 20 20 20 20 72 65 74 75 72 6e 20 74 6f 57 72 69 return toWri
3500: 74 65 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d te;.}../*. *----
3510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3550: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 53 --. *. * DigestS
3560: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a etOptionProc --.
3570: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 *. *.Called by
3580: 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 73 the generic IO s
3590: 79 73 74 65 6d 20 74 6f 20 73 65 74 20 63 68 61 ystem to set cha
35a0: 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 nnel option name
35b0: 20 74 6f 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a to value.. *. *
35c0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c Returns:. *.TCL
35d0: 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 _OK if successfu
35e0: 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 69 l or TCL_ERROR i
35f0: 66 20 66 61 69 6c 65 64 20 61 6c 6f 6e 67 20 77 f failed along w
3600: 69 74 68 20 61 6e 20 65 72 72 6f 72 0a 20 2a 09 ith an error. *.
3610: 6d 65 73 73 61 67 65 20 69 6e 20 69 6e 74 65 72 message in inter
3620: 70 20 61 6e 64 20 54 63 6c 5f 53 65 74 45 72 72 p and Tcl_SetErr
3630: 6e 6f 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 no.. *. * Side e
3640: 66 66 65 63 74 73 3a 0a 20 2a 09 55 70 64 61 74 ffects:. *.Updat
3650: 65 73 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69 6f es channel optio
3660: 6e 20 74 6f 20 6e 65 77 20 76 61 6c 75 65 2e 0a n to new value..
3670: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
3680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
36c0: 73 74 61 74 69 63 20 69 6e 74 20 44 69 67 65 73 static int Diges
36d0: 74 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43 tSetOptionProc(C
36e0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
36f0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
3700: 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 *interp, const
3710: 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 char *optionName
3720: 2c 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f ,..const char *o
3730: 70 74 69 6f 6e 56 61 6c 75 65 29 20 7b 0a 20 20 ptionValue) {.
3740: 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 DigestState *s
3750: 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 tatePtr = (Diges
3760: 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 tState *) client
3770: 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 Data;. Tcl_Ch
3780: 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 annel parent;.
3790: 20 20 54 63 6c 5f 44 72 69 76 65 72 53 65 74 4f Tcl_DriverSetO
37a0: 70 74 69 6f 6e 50 72 6f 63 20 2a 73 65 74 4f 70 ptionProc *setOp
37b0: 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 2f tionProc;.. /
37c0: 2a 20 41 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 * Abort if no ch
37d0: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 annel */. if
37e0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 (statePtr->self
37f0: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 == (Tcl_Channel)
3800: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
3810: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
3820: 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 67 61 }.. /* Delega
3830: 74 65 20 6f 70 74 69 6f 6e 73 20 64 6f 77 6e 73 te options downs
3840: 74 72 65 61 6d 20 2a 2f 0a 20 20 20 20 70 61 72 tream */. par
3850: 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 ent = Tcl_GetSta
3860: 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 ckedChannel(stat
3870: 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 ePtr->self);.
3880: 20 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d setOptionProc =
3890: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 53 65 74 4f Tcl_ChannelSetO
38a0: 70 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 ptionProc(Tcl_Ge
38b0: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 tChannelType(par
38c0: 65 6e 74 29 29 3b 0a 20 20 20 20 69 66 20 28 73 ent));. if (s
38d0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 etOptionProc !=
38e0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
38f0: 28 2a 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 (*setOptionProc)
3900: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 (Tcl_GetChannelI
3910: 6e 73 74 61 6e 63 65 44 61 74 61 28 70 61 72 65 nstanceData(pare
3920: 6e 74 29 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 nt), interp, opt
3930: 69 6f 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 ionName, optionV
3940: 61 6c 75 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 alue);. } els
3950: 65 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e e {..Tcl_SetErrn
3960: 6f 28 45 49 4e 56 41 4c 29 3b 0a 09 72 65 74 75 o(EINVAL);..retu
3970: 72 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65 rn Tcl_BadChanne
3980: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
3990: 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 4e 55 4c 4c optionName, NULL
39a0: 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 );. }.}../*.
39b0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
39c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
39d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
39e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
39f0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 -------. *. * Di
3a00: 67 65 73 74 47 65 74 4f 70 74 69 6f 6e 50 72 6f gestGetOptionPro
3a10: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 c --. *. *.Calle
3a20: 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 d by the generic
3a30: 20 49 4f 20 73 79 73 74 65 6d 20 74 6f 20 67 65 IO system to ge
3a40: 74 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e t channel option
3a50: 20 6e 61 6d 65 27 73 20 76 61 6c 75 65 2e 0a 20 name's value..
3a60: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a *. * Returns:. *
3a70: 09 54 43 4c 5f 4f 4b 20 69 66 20 73 75 63 63 65 .TCL_OK if succe
3a80: 73 73 66 75 6c 20 6f 72 20 54 43 4c 5f 45 52 52 ssful or TCL_ERR
3a90: 4f 52 20 69 66 20 66 61 69 6c 65 64 20 61 6c 6f OR if failed alo
3aa0: 6e 67 20 77 69 74 68 20 61 6e 20 65 72 72 6f 72 ng with an error
3ab0: 0a 20 2a 09 6d 65 73 73 61 67 65 20 69 6e 20 69 . *.message in i
3ac0: 6e 74 65 72 70 20 61 6e 64 20 54 63 6c 5f 53 65 nterp and Tcl_Se
3ad0: 74 45 72 72 6e 6f 2e 0a 20 2a 0a 20 2a 20 53 69 tErrno.. *. * Si
3ae0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 de effects:. *.S
3af0: 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 6f 70 ets result to op
3b00: 74 69 6f 6e 27 73 20 76 61 6c 75 65 0a 20 2a 0a tion's value. *.
3b10: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
3b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b50: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
3b60: 74 69 63 20 69 6e 74 20 44 69 67 65 73 74 47 65 tic int DigestGe
3b70: 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c 69 65 tOptionProc(Clie
3b80: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
3b90: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
3ba0: 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 nterp, const cha
3bb0: 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 0a 09 r *optionName,..
3bc0: 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a 6f 70 74 Tcl_DString *opt
3bd0: 69 6f 6e 56 61 6c 75 65 29 20 7b 0a 20 20 20 20 ionValue) {.
3be0: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 DigestState *sta
3bf0: 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 tePtr = (DigestS
3c00: 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 tate *) clientDa
3c10: 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e ta;. Tcl_Chan
3c20: 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 nel parent;.
3c30: 54 63 6c 5f 44 72 69 76 65 72 47 65 74 4f 70 74 Tcl_DriverGetOpt
3c40: 69 6f 6e 50 72 6f 63 20 2a 67 65 74 4f 70 74 69 ionProc *getOpti
3c50: 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 2f 2a 20 onProc;.. /*
3c60: 41 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61 6e Abort if no chan
3c70: 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 nel */. if (s
3c80: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d tatePtr->self ==
3c90: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
3ca0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
3cb0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
3cc0: 0a 20 20 20 20 2f 2a 20 44 65 6c 65 67 61 74 65 . /* Delegate
3cd0: 20 6f 70 74 69 6f 6e 73 20 64 6f 77 6e 73 74 72 options downstr
3ce0: 65 61 6d 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e eam */. paren
3cf0: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b t = Tcl_GetStack
3d00: 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 edChannel(stateP
3d10: 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 67 tr->self);. g
3d20: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 54 etOptionProc = T
3d30: 63 6c 5f 43 68 61 6e 6e 65 6c 47 65 74 4f 70 74 cl_ChannelGetOpt
3d40: 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 ionProc(Tcl_GetC
3d50: 68 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 6e hannelType(paren
3d60: 74 29 29 3b 0a 20 20 20 20 69 66 20 28 67 65 74 t));. if (get
3d70: 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 OptionProc != NU
3d80: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28 2a LL) {..return (*
3d90: 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28 54 getOptionProc)(T
3da0: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 cl_GetChannelIns
3db0: 74 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e 74 tanceData(parent
3dc0: 29 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f ), interp, optio
3dd0: 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 6c nName, optionVal
3de0: 75 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 ue);. } else
3df0: 69 66 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 20 3d if (optionName =
3e00: 3d 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c 29 20 = (char*) NULL)
3e10: 7b 0a 09 2f 2a 20 52 65 71 75 65 73 74 20 69 73 {../* Request is
3e20: 20 71 75 65 72 79 20 66 6f 72 20 61 6c 6c 20 6f query for all o
3e30: 70 74 69 6f 6e 73 2c 20 74 68 69 73 20 69 73 20 ptions, this is
3e40: 6f 6b 2e 20 2a 2f 0a 09 72 65 74 75 72 6e 20 54 ok. */..return T
3e50: 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 CL_OK;. } els
3e60: 65 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e e {..Tcl_SetErrn
3e70: 6f 28 45 49 4e 56 41 4c 29 3b 0a 09 72 65 74 75 o(EINVAL);..retu
3e80: 72 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65 rn Tcl_BadChanne
3e90: 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 lOption(interp,
3ea0: 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 4e 55 4c 4c optionName, NULL
3eb0: 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 );. }.}../*.
3ec0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
3ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 0a 20 2a 20 44 69 -------. *. * Di
3f10: 67 65 73 74 54 69 6d 65 72 48 61 6e 64 6c 65 72 gestTimerHandler
3f20: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 --. *. *.Called
3f30: 20 62 79 20 74 68 65 20 6e 6f 74 69 66 69 65 72 by the notifier
3f40: 20 76 69 61 20 74 69 6d 65 72 20 74 6f 20 66 6c via timer to fl
3f50: 75 73 68 20 6f 75 74 20 70 65 6e 64 69 6e 67 20 ush out pending
3f60: 69 6e 70 75 74 20 64 61 74 61 2e 0a 20 2a 0a 20 input data.. *.
3f70: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f * Returns:. *.No
3f80: 74 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65 thing. *. * Side
3f90: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 effects:. *.May
3fa0: 20 63 61 6c 6c 20 54 63 6c 5f 4e 6f 74 69 66 79 call Tcl_Notify
3fb0: 43 68 61 6e 6e 65 6c 0a 20 2a 0a 20 2a 2d 2d 2d Channel. *. *---
3fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4000: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 ---. */.static v
4010: 6f 69 64 20 44 69 67 65 73 74 54 69 6d 65 72 48 oid DigestTimerH
4020: 61 6e 64 6c 65 72 28 43 6c 69 65 6e 74 44 61 74 andler(ClientDat
4030: 61 20 63 6c 69 65 6e 74 44 61 74 61 29 20 7b 0a a clientData) {.
4040: 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 DigestState
4050: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 *statePtr = (Dig
4060: 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 estState *) clie
4070: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 ntData;.. /*
4080: 41 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61 6e Abort if no chan
4090: 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 nel */. if (s
40a0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d tatePtr->self ==
40b0: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
40c0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a ULL) {..return;.
40d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c }.. /* Cl
40e0: 65 61 72 20 74 69 6d 65 72 20 74 6f 6b 65 6e 20 ear timer token
40f0: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d */. statePtr-
4100: 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 >timer = (Tcl_Ti
4110: 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a merToken) NULL;.
4120: 0a 20 20 20 20 2f 2a 20 46 69 72 65 20 65 76 65 . /* Fire eve
4130: 6e 74 20 69 66 20 74 68 65 72 65 20 69 73 20 70 nt if there is p
4140: 65 6e 64 69 6e 67 20 64 61 74 61 2c 20 73 6b 69 ending data, ski
4150: 70 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 p otherwise */.
4160: 20 20 20 69 66 20 28 28 73 74 61 74 65 50 74 72 if ((statePtr
4170: 2d 3e 77 61 74 63 68 4d 61 73 6b 20 26 20 54 43 ->watchMask & TC
4180: 4c 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20 28 L_READABLE) && (
4190: 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 Tcl_InputBuffere
41a0: 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 d(statePtr->self
41b0: 29 20 3e 20 30 29 29 20 7b 0a 09 54 63 6c 5f 4e ) > 0)) {..Tcl_N
41c0: 6f 74 69 66 79 43 68 61 6e 6e 65 6c 28 73 74 61 otifyChannel(sta
41d0: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 54 43 4c tePtr->self, TCL
41e0: 5f 52 45 41 44 41 42 4c 45 29 3b 0a 20 20 20 20 _READABLE);.
41f0: 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d }.}../*. *------
4200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4240: 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 57 61 74 . *. * DigestWat
4250: 63 68 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 chProc --. *. *.
4260: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e Initialize the n
4270: 6f 74 69 66 69 65 72 20 74 6f 20 77 61 74 63 68 otifier to watch
4280: 20 66 6f 72 20 65 76 65 6e 74 73 20 66 72 6f 6d for events from
4290: 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 2e 0a 20 this channel..
42a0: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a *. * Returns:. *
42b0: 09 4e 6f 74 68 69 6e 67 20 28 63 61 6e 27 74 20 .Nothing (can't
42c0: 72 65 74 75 72 6e 20 65 72 72 6f 72 20 6d 65 73 return error mes
42d0: 73 61 67 65 73 29 0a 20 2a 0a 20 2a 20 53 69 64 sages). *. * Sid
42e0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 6f e effects:. *.Co
42f0: 6e 66 69 67 75 72 65 20 6e 6f 74 69 66 69 65 72 nfigure notifier
4300: 20 73 6f 20 66 75 74 75 72 65 20 65 76 65 6e 74 so future event
4310: 73 20 6f 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c s on the channel
4320: 20 77 69 6c 6c 20 62 65 20 73 65 65 6e 20 62 79 will be seen by
4330: 20 54 63 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d Tcl.. *. *-----
4340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4380: 2d 0a 20 2a 2f 0a 76 6f 69 64 20 44 69 67 65 73 -. */.void Diges
4390: 74 57 61 74 63 68 50 72 6f 63 28 43 6c 69 65 6e tWatchProc(Clien
43a0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
43b0: 2c 20 69 6e 74 20 6d 61 73 6b 29 20 7b 0a 20 20 , int mask) {.
43c0: 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 DigestState *s
43d0: 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 tatePtr = (Diges
43e0: 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 tState *) client
43f0: 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 Data;. Tcl_Ch
4400: 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 annel parent;.
4410: 20 20 54 63 6c 5f 44 72 69 76 65 72 57 61 74 63 Tcl_DriverWatc
4420: 68 50 72 6f 63 20 2a 77 61 74 63 68 50 72 6f 63 hProc *watchProc
4430: 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 ;.. /* Abort
4440: 69 66 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f if no channel */
4450: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
4460: 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f r->self == (Tcl_
4470: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
4480: 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a ..return;. }.
4490: 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 4f 52 . /* Store OR
44a0: 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 -ed combination
44b0: 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 2c of TCL_READABLE,
44c0: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 61 6e TCL_WRITABLE an
44d0: 64 20 54 43 4c 5f 45 58 43 45 50 54 49 4f 4e 20 d TCL_EXCEPTION
44e0: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d */. statePtr-
44f0: 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 6d 61 73 >watchMask = mas
4500: 6b 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 70 61 k;.. /* Propa
4510: 67 61 74 65 20 6d 61 73 6b 20 69 6e 66 6f 20 74 gate mask info t
4520: 6f 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c o parent channel
4530: 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 20 3d */. parent =
4540: 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 Tcl_GetStackedC
4550: 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d hannel(statePtr-
4560: 3e 73 65 6c 66 29 3b 0a 20 20 20 20 77 61 74 63 >self);. watc
4570: 68 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e hProc = Tcl_Chan
4580: 6e 65 6c 57 61 74 63 68 50 72 6f 63 28 54 63 6c nelWatchProc(Tcl
4590: 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 _GetChannelType(
45a0: 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 77 61 parent));. wa
45b0: 74 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 tchProc(Tcl_GetC
45c0: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 hannelInstanceDa
45d0: 74 61 28 70 61 72 65 6e 74 29 2c 20 6d 61 73 6b ta(parent), mask
45e0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f 76 );.. /* Remov
45f0: 65 20 70 65 6e 64 69 6e 67 20 74 69 6d 65 72 20 e pending timer
4600: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 */. if (state
4610: 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 Ptr->timer != (T
4620: 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e cl_TimerToken) N
4630: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 ULL) {..Tcl_Dele
4640: 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 teTimerHandler(s
4650: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b tatePtr->timer);
4660: 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 ..statePtr->time
4670: 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f r = (Tcl_TimerTo
4680: 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d ken) NULL;. }
4690: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 .. /* If ther
46a0: 65 20 69 73 20 64 61 74 61 20 70 65 6e 64 69 6e e is data pendin
46b0: 67 2c 20 73 65 74 20 6e 65 77 20 74 69 6d 65 72 g, set new timer
46c0: 20 74 6f 20 63 61 6c 6c 20 54 63 6c 5f 4e 6f 74 to call Tcl_Not
46d0: 69 66 79 43 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 ifyChannel */.
46e0: 20 20 69 66 20 28 28 6d 61 73 6b 20 26 20 54 43 if ((mask & TC
46f0: 4c 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20 28 L_READABLE) && (
4700: 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 65 Tcl_InputBuffere
4710: 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 d(statePtr->self
4720: 29 20 3e 20 30 29 29 20 7b 0a 09 73 74 61 74 65 ) > 0)) {..state
4730: 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 54 63 6c Ptr->timer = Tcl
4740: 5f 43 72 65 61 74 65 54 69 6d 65 72 48 61 6e 64 _CreateTimerHand
4750: 6c 65 72 28 52 45 41 44 5f 44 45 4c 41 59 2c 20 ler(READ_DELAY,
4760: 44 69 67 65 73 74 54 69 6d 65 72 48 61 6e 64 6c DigestTimerHandl
4770: 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 er, (ClientData)
4780: 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 statePtr);.
4790: 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d }.}../*. *------
47a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47e0: 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 47 65 74 . *. * DigestGet
47f0: 48 61 6e 64 6c 65 50 72 6f 63 20 2d 2d 0a 20 2a HandleProc --. *
4800: 0a 20 2a 09 43 61 6c 6c 65 64 20 66 72 6f 6d 20 . *.Called from
4810: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48 61 Tcl_GetChannelHa
4820: 6e 64 6c 65 20 74 6f 20 72 65 74 72 69 65 76 65 ndle to retrieve
4830: 20 4f 53 20 73 70 65 63 69 66 69 63 20 66 69 6c OS specific fil
4840: 65 20 68 61 6e 64 6c 65 0a 20 2a 09 66 72 6f 6d e handle. *.from
4850: 20 69 6e 73 69 64 65 20 74 68 69 73 20 63 68 61 inside this cha
4860: 6e 6e 65 6c 2e 20 4e 6f 74 20 75 73 65 64 20 66 nnel. Not used f
4870: 6f 72 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f or transformatio
4880: 6e 73 3f 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e ns?. *. * Return
4890: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 66 6f 72 s:. *.TCL_OK for
48a0: 20 73 75 63 63 65 73 73 20 6f 72 20 54 43 4c 5f success or TCL_
48b0: 45 52 52 4f 52 20 66 6f 72 20 65 72 72 6f 72 20 ERROR for error
48c0: 6f 72 20 69 66 20 6e 6f 74 20 73 75 70 70 6f 72 or if not suppor
48d0: 74 65 64 2e 20 49 66 0a 20 2a 09 64 69 72 65 63 ted. If. *.direc
48e0: 74 69 6f 6e 20 69 73 20 54 43 4c 5f 52 45 41 44 tion is TCL_READ
48f0: 41 42 4c 45 2c 20 73 65 74 73 20 68 61 6e 64 6c ABLE, sets handl
4900: 65 50 74 72 20 74 6f 20 74 68 65 20 68 61 6e 64 ePtr to the hand
4910: 6c 65 20 75 73 65 64 20 66 6f 72 0a 20 2a 09 69 le used for. *.i
4920: 6e 70 75 74 2c 20 6f 72 20 69 66 20 54 43 4c 5f nput, or if TCL_
4930: 57 52 49 54 41 42 4c 45 20 73 65 74 73 20 74 6f WRITABLE sets to
4940: 20 74 68 65 20 68 61 6e 64 6c 65 20 75 73 65 64 the handle used
4950: 20 66 6f 72 20 6f 75 74 70 75 74 2e 0a 20 2a 0a for output.. *.
4960: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
4970: 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d . *.None. *. *--
4980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49c0: 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 ----. */.int Dig
49d0: 65 73 74 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 estGetHandleProc
49e0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
49f0: 6e 74 44 61 74 61 2c 20 69 6e 74 20 64 69 72 65 ntData, int dire
4a00: 63 74 69 6f 6e 2c 20 43 6c 69 65 6e 74 44 61 74 ction, ClientDat
4a10: 61 20 2a 68 61 6e 64 6c 65 50 74 72 29 20 7b 0a a *handlePtr) {.
4a20: 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 DigestState
4a30: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 *statePtr = (Dig
4a40: 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 estState *) clie
4a50: 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f ntData;. Tcl_
4a60: 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a Channel parent;.
4a70: 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 . /* Abort if
4a80: 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 no channel */.
4a90: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
4aa0: 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 >self == (Tcl_Ch
4ab0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
4ac0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
4ad0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 61 72 ;. }.. par
4ae0: 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 ent = Tcl_GetSta
4af0: 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 ckedChannel(stat
4b00: 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 ePtr->self);.
4b10: 20 72 65 74 75 72 6e 20 54 63 6c 5f 47 65 74 43 return Tcl_GetC
4b20: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 28 70 61 72 hannelHandle(par
4b30: 65 6e 74 2c 20 64 69 72 65 63 74 69 6f 6e 2c 20 ent, direction,
4b40: 68 61 6e 64 6c 65 50 74 72 29 3b 0a 7d 0a 0a 2f handlePtr);.}../
4b50: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
4b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
4ba0: 20 44 69 67 65 73 74 4e 6f 74 69 66 79 50 72 6f DigestNotifyPro
4bb0: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 c --. *. *.Calle
4bc0: 64 20 62 79 20 54 63 6c 20 74 6f 20 69 6e 66 6f d by Tcl to info
4bd0: 72 6d 20 75 73 20 6f 66 20 61 63 74 69 76 69 74 rm us of activit
4be0: 79 20 6f 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 y on the underly
4bf0: 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a ing channel.. *.
4c00: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 55 * Returns:. *.U
4c10: 6e 63 68 61 6e 67 65 64 20 69 6e 74 65 72 65 73 nchanged interes
4c20: 74 4d 61 73 6b 20 77 68 69 63 68 20 69 73 20 61 tMask which is a
4c30: 6e 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 n OR-ed combinat
4c40: 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 ion of TCL_READA
4c50: 42 4c 45 20 6f 72 20 54 43 4c 5f 57 52 49 54 41 BLE or TCL_WRITA
4c60: 42 4c 45 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 BLE. *. * Side e
4c70: 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6e 63 65 ffects:. *.Cance
4c80: 6c 73 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 74 ls any pending t
4c90: 69 6d 65 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d imer.. *. *-----
4ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ce0: 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 -. */.int Digest
4cf0: 4e 6f 74 69 66 79 50 72 6f 63 28 43 6c 69 65 6e NotifyProc(Clien
4d00: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
4d10: 2c 20 69 6e 74 20 69 6e 74 65 72 65 73 74 4d 61 , int interestMa
4d20: 73 6b 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 sk) {. Digest
4d30: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
4d40: 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a = (DigestState *
4d50: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 ) clientData;..
4d60: 20 20 20 2f 2a 20 53 6b 69 70 20 74 69 6d 65 72 /* Skip timer
4d70: 20 65 76 65 6e 74 20 61 73 20 72 65 64 75 6e 64 event as redund
4d80: 61 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 ant */. if (s
4d90: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 tatePtr->timer !
4da0: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 = (Tcl_TimerToke
4db0: 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f n) NULL) {..Tcl_
4dc0: 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c DeleteTimerHandl
4dd0: 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d er(statePtr->tim
4de0: 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e er);..statePtr->
4df0: 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d timer = (Tcl_Tim
4e00: 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 erToken) NULL;.
4e10: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
4e20: 69 6e 74 65 72 65 73 74 4d 61 73 6b 3b 0a 7d 0a interestMask;.}.
4e30: 0a 2f 2a 0a 20 2a 0a 20 2a 20 43 68 61 6e 6e 65 ./*. *. * Channe
4e40: 6c 20 74 79 70 65 20 73 74 72 75 63 74 75 72 65 l type structure
4e50: 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 definition for
4e60: 64 69 67 65 73 74 20 74 72 61 6e 73 66 6f 72 6d digest transform
4e70: 61 74 69 6f 6e 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 ations.. *. */.s
4e80: 74 61 74 69 63 20 63 6f 6e 73 74 20 54 63 6c 5f tatic const Tcl_
4e90: 43 68 61 6e 6e 65 6c 54 79 70 65 20 64 69 67 65 ChannelType dige
4ea0: 73 74 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 stChannelType =
4eb0: 7b 0a 20 20 20 20 22 64 69 67 65 73 74 22 2c 09 {. "digest",.
4ec0: 09 09 2f 2a 20 54 79 70 65 20 6e 61 6d 65 20 2a ../* Type name *
4ed0: 2f 0a 20 20 20 20 54 43 4c 5f 43 48 41 4e 4e 45 /. TCL_CHANNE
4ee0: 4c 5f 56 45 52 53 49 4f 4e 5f 35 2c 09 2f 2a 20 L_VERSION_5,./*
4ef0: 76 35 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 v5 channel */.
4f00: 20 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f DigestClosePro
4f10: 63 2c 09 09 2f 2a 20 43 6c 6f 73 65 20 70 72 6f c,../* Close pro
4f20: 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 49 c */. DigestI
4f30: 6e 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20 49 6e nputProc,../* In
4f40: 70 75 74 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 put proc */.
4f50: 44 69 67 65 73 74 4f 75 74 70 75 74 50 72 6f 63 DigestOutputProc
4f60: 2c 09 09 2f 2a 20 4f 75 74 70 75 74 20 70 72 6f ,../* Output pro
4f70: 63 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 c */. NULL,..
4f80: 09 2f 2a 20 53 65 65 6b 20 70 72 6f 63 20 2a 2f ./* Seek proc */
4f90: 0a 20 20 20 20 44 69 67 65 73 74 53 65 74 4f 70 . DigestSetOp
4fa0: 74 69 6f 6e 50 72 6f 63 2c 09 2f 2a 20 53 65 74 tionProc,./* Set
4fb0: 20 6f 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a option proc */.
4fc0: 20 20 20 20 44 69 67 65 73 74 47 65 74 4f 70 74 DigestGetOpt
4fd0: 69 6f 6e 50 72 6f 63 2c 09 2f 2a 20 47 65 74 20 ionProc,./* Get
4fe0: 6f 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 option proc */.
4ff0: 20 20 20 44 69 67 65 73 74 57 61 74 63 68 50 72 DigestWatchPr
5000: 6f 63 2c 09 09 2f 2a 20 49 6e 69 74 69 61 6c 69 oc,../* Initiali
5010: 7a 65 20 6e 6f 74 69 66 69 65 72 20 2a 2f 0a 20 ze notifier */.
5020: 20 20 20 44 69 67 65 73 74 47 65 74 48 61 6e 64 DigestGetHand
5030: 6c 65 50 72 6f 63 2c 09 2f 2a 20 47 65 74 20 4f leProc,./* Get O
5040: 53 20 68 61 6e 64 6c 65 73 20 6f 75 74 20 6f 66 S handles out of
5050: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
5060: 44 69 67 65 73 74 43 6c 6f 73 65 32 50 72 6f 63 DigestClose2Proc
5070: 2c 09 09 2f 2a 20 63 6c 6f 73 65 32 70 72 6f 63 ,../* close2proc
5080: 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 42 6c */. DigestBl
5090: 6f 63 6b 4d 6f 64 65 50 72 6f 63 2c 09 2f 2a 20 ockModeProc,./*
50a0: 53 65 74 20 62 6c 6f 63 6b 69 6e 67 2f 6e 6f 6e Set blocking/non
50b0: 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2a 2f 0a blocking mode*/.
50c0: 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 46 NULL,.../* F
50d0: 6c 75 73 68 20 70 72 6f 63 20 2a 2f 0a 20 20 20 lush proc */.
50e0: 20 44 69 67 65 73 74 4e 6f 74 69 66 79 50 72 6f DigestNotifyPro
50f0: 63 2c 09 09 2f 2a 20 48 61 6e 64 6c 69 6e 67 20 c,../* Handling
5100: 6f 66 20 65 76 65 6e 74 73 20 62 75 62 62 6c 69 of events bubbli
5110: 6e 67 20 75 70 20 2a 2f 0a 20 20 20 20 4e 55 4c ng up */. NUL
5120: 4c 2c 09 09 09 2f 2a 20 57 69 64 65 20 73 65 65 L,.../* Wide see
5130: 6b 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 4e 55 k proc */. NU
5140: 4c 4c 2c 09 09 09 2f 2a 20 54 68 72 65 61 64 20 LL,.../* Thread
5150: 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 4e 55 action */. NU
5160: 4c 4c 09 09 09 2f 2a 20 54 72 75 6e 63 61 74 65 LL.../* Truncate
5170: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d */.};../*. *---
5180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
51a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
51b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
51c0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 ---. *. * Digest
51d0: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 20 2d ChannelHandler -
51e0: 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65 20 61 -. *. *.Create a
51f0: 20 73 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c stacked channel
5200: 20 66 6f 72 20 61 20 6d 65 73 73 61 67 65 20 64 for a message d
5210: 69 67 65 73 74 20 74 72 61 6e 73 66 6f 72 6d 61 igest transforma
5220: 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 tion.. *. * Retu
5230: 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f rns:. *.TCL_OK o
5240: 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 r TCL_ERROR. *.
5250: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
5260: 20 2a 09 41 64 64 73 20 74 72 61 6e 73 66 6f 72 *.Adds transfor
5270: 6d 20 74 6f 20 63 68 61 6e 6e 65 6c 20 61 6e 64 m to channel and
5280: 20 73 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 sets result to
5290: 63 68 61 6e 6e 65 6c 20 69 64 20 6f 72 20 65 72 channel id or er
52a0: 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a ror message.. *.
52b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
52c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
52f0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
5300: 74 69 63 20 69 6e 74 20 44 69 67 65 73 74 43 68 tic int DigestCh
5310: 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 28 54 63 6c annelHandler(Tcl
5320: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
5330: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 68 61 const char *cha
5340: 6e 6e 65 6c 2c 20 63 6f 6e 73 74 20 45 56 50 5f nnel, const EVP_
5350: 4d 44 20 2a 6d 64 2c 0a 09 63 6f 6e 73 74 20 45 MD *md,..const E
5360: 56 50 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 VP_CIPHER *ciphe
5370: 72 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c 20 54 r, int format, T
5380: 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 2c 20 cl_Obj *keyObj,
5390: 45 56 50 5f 4d 41 43 20 2a 6d 61 63 29 20 7b 0a EVP_MAC *mac) {.
53a0: 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 20 2f 2a int mode; /*
53b0: 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 OR-ed combinati
53c0: 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 on of TCL_READAB
53d0: 4c 45 20 61 6e 64 20 54 43 4c 5f 57 52 49 54 41 LE and TCL_WRITA
53e0: 42 4c 45 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 43 BLE */. Tcl_C
53f0: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 hannel chan;.
5400: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 DigestState *st
5410: 61 74 65 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 atePtr;.. dpr
5420: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
5430: 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 . /* Validate
5440: 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 69 66 20 args */. if
5450: 28 63 68 61 6e 6e 65 6c 20 3d 3d 20 28 63 6f 6e (channel == (con
5460: 73 74 20 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 st char *) NULL)
5470: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
5480: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
5490: 20 2f 2a 20 47 65 74 20 63 68 61 6e 6e 65 6c 20 /* Get channel
54a0: 49 64 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d Id */. chan =
54b0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 Tcl_GetChannel(
54c0: 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 2c interp, channel,
54d0: 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 &mode);. if
54e0: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 (chan == (Tcl_Ch
54f0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
5500: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
5510: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
5520: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 Make sure to ope
5530: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d rate on the topm
5540: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 ost channel */.
5550: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
5560: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
5570: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 );.. /* Creat
5580: 65 20 73 74 61 74 65 20 64 61 74 61 20 73 74 72 e state data str
5590: 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 66 ucture */. if
55a0: 20 28 28 73 74 61 74 65 50 74 72 20 3d 20 44 69 ((statePtr = Di
55b0: 67 65 73 74 53 74 61 74 65 4e 65 77 28 69 6e 74 gestStateNew(int
55c0: 65 72 70 2c 20 66 6f 72 6d 61 74 29 29 20 3d 3d erp, format)) ==
55d0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 NULL) {..Tcl_Ap
55e0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
55f0: 70 2c 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 p, "Memory alloc
5600: 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c 20 28 63 ation error", (c
5610: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 har *) NULL);..r
5620: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
5630: 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 . }. state
5640: 50 74 72 2d 3e 73 65 6c 66 20 3d 20 63 68 61 6e Ptr->self = chan
5650: 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e ;. statePtr->
5660: 6d 6f 64 65 20 3d 20 6d 6f 64 65 3b 0a 0a 20 20 mode = mode;..
5670: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 /* Initialize
5680: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f hash function */
5690: 0a 20 20 20 20 69 66 20 28 44 69 67 65 73 74 49 . if (DigestI
56a0: 6e 69 74 69 61 6c 69 7a 65 28 69 6e 74 65 72 70 nitialize(interp
56b0: 2c 20 73 74 61 74 65 50 74 72 2c 20 6d 64 2c 20 , statePtr, md,
56c0: 63 69 70 68 65 72 2c 20 6b 65 79 4f 62 6a 2c 20 cipher, keyObj,
56d0: 6d 61 63 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 mac) != TCL_OK)
56e0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
56f0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
5700: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 20 63 68 61 /* Configure cha
5710: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 54 63 6c 5f nnel */. Tcl_
5720: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e SetChannelOption
5730: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 (interp, chan, "
5740: 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 -translation", "
5750: 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 69 66 binary");. if
5760: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
5770: 42 75 66 66 65 72 53 69 7a 65 28 63 68 61 6e 29 BufferSize(chan)
5780: 20 3c 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 < EVP_MAX_MD_SI
5790: 5a 45 20 2a 20 32 29 20 7b 0a 09 54 63 6c 5f 53 ZE * 2) {..Tcl_S
57a0: 65 74 43 68 61 6e 6e 65 6c 42 75 66 66 65 72 53 etChannelBufferS
57b0: 69 7a 65 28 63 68 61 6e 2c 20 45 56 50 5f 4d 41 ize(chan, EVP_MA
57c0: 58 5f 4d 44 5f 53 49 5a 45 20 2a 20 32 29 3b 0a X_MD_SIZE * 2);.
57d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74 }.. /* St
57e0: 61 63 6b 20 63 68 61 6e 6e 65 6c 2c 20 61 62 6f ack channel, abo
57f0: 72 74 20 66 6f 72 20 65 72 72 6f 72 20 2a 2f 0a rt for error */.
5800: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 statePtr->se
5810: 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 lf = Tcl_StackCh
5820: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 26 64 annel(interp, &d
5830: 69 67 65 73 74 43 68 61 6e 6e 65 6c 54 79 70 65 igestChannelType
5840: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 , (ClientData) s
5850: 74 61 74 65 50 74 72 2c 20 6d 6f 64 65 2c 20 63 tatePtr, mode, c
5860: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 73 74 han);. if (st
5870: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 atePtr->self ==
5880: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
5890: 4c 4c 29 20 7b 0a 09 44 69 67 65 73 74 53 74 61 LL) {..DigestSta
58a0: 74 65 46 72 65 65 28 73 74 61 74 65 50 74 72 29 teFree(statePtr)
58b0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
58c0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
58d0: 2f 2a 20 53 65 74 20 72 65 73 75 6c 74 20 74 6f /* Set result to
58e0: 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 channel Id */.
58f0: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 Tcl_SetResult
5900: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a (interp, (char *
5910: 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c ) Tcl_GetChannel
5920: 4e 61 6d 65 28 63 68 61 6e 29 2c 20 54 43 4c 5f Name(chan), TCL_
5930: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 VOLATILE);. r
5940: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
5950: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
5960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
59a0: 20 2a 20 55 6e 73 74 61 63 6b 20 43 68 61 6e 6e * Unstack Chann
59b0: 65 6c 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 el --. *. *.This
59c0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 6d 6f 76 65 function remove
59d0: 73 20 74 68 65 20 73 74 61 63 6b 65 64 20 63 68 s the stacked ch
59e0: 61 6e 6e 65 6c 20 66 72 6f 6d 20 74 68 65 20 74 annel from the t
59f0: 6f 70 20 6f 66 20 74 68 65 0a 20 2a 09 63 68 61 op of the. *.cha
5a00: 6e 6e 65 6c 20 73 74 61 63 6b 20 69 66 20 69 74 nnel stack if it
5a10: 20 69 73 20 61 20 64 69 67 65 73 74 20 63 68 61 is a digest cha
5a20: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 nnel.. *. * Retu
5a30: 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f rns:. *.TCL_OK o
5a40: 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 r TCL_ERROR. *.
5a50: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
5a60: 20 2a 09 52 65 6d 6f 76 65 73 20 74 72 61 6e 73 *.Removes trans
5a70: 66 6f 72 6d 20 66 72 6f 6d 20 63 68 61 6e 6e 65 form from channe
5a80: 6c 20 6f 72 20 73 65 74 73 20 72 65 73 75 6c 74 l or sets result
5a90: 20 74 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67 to error messag
5aa0: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
5ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
5af0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 69 */.static int Di
5b00: 67 65 73 74 55 6e 73 74 61 63 6b 4f 62 6a 43 6d gestUnstackObjCm
5b10: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
5b20: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
5b30: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
5b40: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
5b50: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
5b60: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
5b70: 63 68 61 6e 3b 0a 20 20 20 20 69 6e 74 20 6d 6f chan;. int mo
5b80: 64 65 3b 20 2f 2a 20 4f 52 2d 65 64 20 63 6f 6d de; /* OR-ed com
5b90: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f bination of TCL_
5ba0: 52 45 41 44 41 42 4c 45 20 61 6e 64 20 54 43 4c READABLE and TCL
5bb0: 5f 57 52 49 54 41 42 4c 45 20 20 2a 2f 0a 0a 20 _WRITABLE */..
5bc0: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
5bd0: 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 ed");.. /* Va
5be0: 6c 69 64 61 74 65 20 61 72 67 20 63 6f 75 6e 74 lidate arg count
5bf0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 */. if (objc
5c00: 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 != 2) {..Tcl_Wr
5c10: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
5c20: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 p, 1, objv, "cha
5c30: 6e 6e 65 6c 49 64 22 29 3b 0a 09 72 65 74 75 72 nnelId");..retur
5c40: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
5c50: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 }.. /* Get c
5c60: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 hannel */. ch
5c70: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e an = Tcl_GetChan
5c80: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f nel(interp, Tcl_
5c90: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
5ca0: 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c (objv[1], NULL),
5cb0: 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 &mode);. if
5cc0: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 (chan == (Tcl_Ch
5cd0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
5ce0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
5cf0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
5d00: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 Make sure to ope
5d10: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d rate on the topm
5d20: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 ost channel */.
5d30: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
5d40: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
5d50: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b );.. /* Check
5d60: 20 69 66 20 64 69 67 65 73 74 20 63 68 61 6e 6e if digest chann
5d70: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 el */. if (Tc
5d80: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
5d90: 28 63 68 61 6e 29 20 21 3d 20 26 64 69 67 65 73 (chan) != &diges
5da0: 74 43 68 61 6e 6e 65 6c 54 79 70 65 29 20 7b 0a tChannelType) {.
5db0: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
5dc0: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 t(interp, "bad c
5dd0: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f hannel \"", Tcl_
5de0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
5df0: 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 han),.. "\":
5e00: 6e 6f 74 20 61 20 64 69 67 65 73 74 20 63 68 61 not a digest cha
5e10: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 nnel", NULL);..T
5e20: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
5e30: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
5e40: 55 4e 53 54 41 43 4b 22 2c 20 22 43 48 41 4e 4e UNSTACK", "CHANN
5e50: 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 EL", "INVALID",
5e60: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
5e70: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
5e80: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
5e90: 20 50 6f 70 20 74 72 61 6e 73 66 6f 72 6d 20 66 Pop transform f
5ea0: 72 6f 6d 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 rom channel */.
5eb0: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 55 6e return Tcl_Un
5ec0: 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 stackChannel(int
5ed0: 65 72 70 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 erp, chan);.
5ee0: 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c .clientData = cl
5ef0: 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 2a ientData;.}../**
5f00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5f10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5f20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5f40: 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d */../*. *-------
5f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
5f90: 20 2a 20 44 69 67 65 73 74 49 6e 73 74 61 6e 63 * DigestInstanc
5fa0: 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a eObjCmd --. *. *
5fb0: 09 48 61 6e 64 6c 65 72 20 66 6f 72 20 64 69 67 .Handler for dig
5fc0: 65 73 74 20 63 6f 6d 6d 61 6e 64 20 69 6e 73 74 est command inst
5fd0: 61 6e 63 65 73 2e 20 55 73 65 64 20 74 6f 20 61 ances. Used to a
5fe0: 64 64 20 64 61 74 61 20 74 6f 20 68 61 73 68 0a dd data to hash.
5ff0: 20 2a 09 66 75 6e 63 74 69 6f 6e 20 6f 72 20 72 *.function or r
6000: 65 74 72 69 65 76 65 20 6d 65 73 73 61 67 65 20 etrieve message
6010: 64 69 67 65 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 digest.. *. * Re
6020: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b turns:. *.TCL_OK
6030: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a or TCL_ERROR. *
6040: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
6050: 3a 0a 20 2a 09 41 64 64 73 20 64 61 74 61 20 74 :. *.Adds data t
6060: 6f 20 68 61 73 68 20 6f 72 20 72 65 74 75 72 6e o hash or return
6070: 73 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 s message digest
6080: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
6090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e ---------. */.in
60d0: 74 20 44 69 67 65 73 74 49 6e 73 74 61 6e 63 65 t DigestInstance
60e0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
60f0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
6100: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
6110: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
6120: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
6130: 5d 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 ]) {. DigestS
6140: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
6150: 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 (DigestState *)
6160: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 clientData;.
6170: 20 69 6e 74 20 66 6e 2c 20 6c 65 6e 20 3d 20 30 int fn, len = 0
6180: 3b 0a 20 20 20 20 63 68 61 72 20 2a 62 75 66 20 ;. char *buf
6190: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 73 74 61 74 = NULL;. stat
61a0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 ic const char *i
61b0: 6e 73 74 61 6e 63 65 5f 66 6e 73 20 5b 5d 20 3d nstance_fns [] =
61c0: 20 7b 20 22 66 69 6e 61 6c 69 7a 65 22 2c 20 22 { "finalize", "
61d0: 75 70 64 61 74 65 22 2c 20 4e 55 4c 4c 20 7d 3b update", NULL };
61e0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
61f0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a alled");.. /*
6200: 20 56 61 6c 69 64 61 74 65 20 61 72 67 20 63 6f Validate arg co
6210: 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f unt */. if (o
6220: 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 bjc < 2 || objc
6230: 3e 20 33 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e > 3) {..Tcl_Wron
6240: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
6250: 20 31 2c 20 6f 62 6a 76 2c 20 22 66 75 6e 63 74 1, objv, "funct
6260: 69 6f 6e 20 3f 64 61 74 61 3f 22 29 3b 0a 09 72 ion ?data?");..r
6270: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
6280: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 . }.. /* G
6290: 65 74 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 et function */.
62a0: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e if (Tcl_GetIn
62b0: 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 dexFromObj(inter
62c0: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 69 6e 73 74 p, objv[1], inst
62d0: 61 6e 63 65 5f 66 6e 73 2c 20 22 66 75 6e 63 74 ance_fns, "funct
62e0: 69 6f 6e 22 2c 20 30 2c 20 26 66 6e 29 20 21 3d ion", 0, &fn) !=
62f0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
6300: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
6310: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 66 }.. /* Do f
6320: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 unction */. i
6330: 66 20 28 66 6e 29 20 7b 0a 09 2f 2a 20 47 65 74 f (fn) {../* Get
6340: 20 64 61 74 61 20 6f 72 20 72 65 74 75 72 6e 20 data or return
6350: 65 72 72 6f 72 20 69 66 20 6e 6f 6e 65 20 2a 2f error if none */
6360: 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 33 29 ..if (objc == 3)
6370: 20 7b 0a 09 20 20 20 20 62 75 66 20 3d 20 54 63 {.. buf = Tc
6380: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 l_GetByteArrayFr
6390: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 omObj(objv[2], &
63a0: 6c 65 6e 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a len);..} else {.
63b0: 09 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 . Tcl_WrongNu
63c0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
63d0: 20 6f 62 6a 76 2c 20 22 75 70 64 61 74 65 20 64 objv, "update d
63e0: 61 74 61 22 29 3b 0a 09 20 20 20 20 72 65 74 75 ata");.. retu
63f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
6400: 0a 0a 09 2f 2a 20 55 70 64 61 74 65 20 68 61 73 .../* Update has
6410: 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 09 69 h function */..i
6420: 66 20 28 44 69 67 65 73 74 55 70 64 61 74 65 28 f (DigestUpdate(
6430: 73 74 61 74 65 50 74 72 2c 20 62 75 66 2c 20 28 statePtr, buf, (
6440: 73 69 7a 65 5f 74 29 20 6c 65 6e 2c 20 31 29 20 size_t) len, 1)
6450: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 != TCL_OK) {..
6460: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
6470: 4f 52 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 65 6c OR;..}.. } el
6480: 73 65 20 7b 0a 09 2f 2a 20 46 69 6e 61 6c 69 7a se {../* Finaliz
6490: 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 e hash function
64a0: 61 6e 64 20 63 61 6c 63 75 6c 61 74 65 20 6d 65 and calculate me
64b0: 73 73 61 67 65 20 64 69 67 65 73 74 20 2a 2f 0a ssage digest */.
64c0: 09 69 66 20 28 44 69 67 65 73 74 46 69 6e 61 6c .if (DigestFinal
64d0: 69 7a 65 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ize(interp, stat
64e0: 65 50 74 72 2c 20 4e 55 4c 4c 29 20 21 3d 20 54 ePtr, NULL) != T
64f0: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 CL_OK) {.. re
6500: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
6510: 09 7d 0a 0a 09 54 63 6c 5f 44 65 6c 65 74 65 43 .}...Tcl_DeleteC
6520: 6f 6d 6d 61 6e 64 46 72 6f 6d 54 6f 6b 65 6e 28 ommandFromToken(
6530: 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 interp, statePtr
6540: 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a ->token);. }.
6550: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
6560: 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d K;.}../*. *-----
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 2d 2d 2d ----------------
6590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
65a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
65b0: 2a 0a 20 2a 20 44 69 67 65 73 74 43 6f 6d 6d 61 *. * DigestComma
65c0: 6e 64 44 65 6c 65 74 65 48 61 6e 64 6c 65 72 20 ndDeleteHandler
65d0: 2d 2d 0a 20 2a 0a 20 2a 09 20 43 61 6c 6c 62 61 --. *. *. Callba
65e0: 63 6b 20 74 6f 20 63 6c 65 61 6e 2d 75 70 20 77 ck to clean-up w
65f0: 68 65 6e 20 64 69 67 65 73 74 20 69 6e 73 74 61 hen digest insta
6600: 6e 63 65 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64 nce command is d
6610: 65 6c 65 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 eleted.. *. * Re
6620: 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74 68 69 6e turns:. *.Nothin
6630: 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 g. *. * Side eff
6640: 65 63 74 73 3a 0a 20 2a 09 44 65 73 74 72 6f 79 ects:. *.Destroy
6650: 73 20 73 74 61 74 65 20 69 6e 66 6f 20 73 74 72 s state info str
6660: 75 63 74 75 72 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d ucture. *. *----
6670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
66a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
66b0: 20 2a 2f 0a 76 6f 69 64 20 44 69 67 65 73 74 43 */.void DigestC
66c0: 6f 6d 6d 61 6e 64 44 65 6c 65 74 65 48 61 6e 64 ommandDeleteHand
66d0: 6c 65 72 28 43 6c 69 65 6e 74 44 61 74 61 20 63 ler(ClientData c
66e0: 6c 69 65 6e 74 44 61 74 61 29 20 7b 0a 20 20 20 lientData) {.
66f0: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 DigestState *st
6700: 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 atePtr = (Digest
6710: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 State *) clientD
6720: 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 ata;.. /* Cle
6730: 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 20 44 69 67 an-up */. Dig
6740: 65 73 74 53 74 61 74 65 46 72 65 65 28 73 74 61 estStateFree(sta
6750: 74 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a tePtr);.}../*. *
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 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
67a0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 ---. *. * Digest
67b0: 43 6f 6d 6d 61 6e 64 48 61 6e 64 6c 65 72 20 2d CommandHandler -
67c0: 2d 0a 20 2a 0a 20 2a 09 20 43 72 65 61 74 65 20 -. *. *. Create
67d0: 63 6f 6d 6d 61 6e 64 20 74 6f 20 61 6c 6c 6f 77 command to allow
67e0: 20 75 73 65 72 20 74 6f 20 61 64 64 20 64 61 74 user to add dat
67f0: 61 20 74 6f 20 68 61 73 68 20 66 75 6e 63 74 69 a to hash functi
6800: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e on.. *. * Return
6810: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 s:. *.TCL_OK or
6820: 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 TCL_ERROR. *. *
6830: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
6840: 09 43 72 65 61 74 65 73 20 63 6f 6d 6d 61 6e 64 .Creates command
6850: 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 or error messag
6860: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d e. *. *---------
6870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
68a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 ----------. */.i
68b0: 6e 74 20 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 nt DigestCommand
68c0: 48 61 6e 64 6c 65 72 28 54 63 6c 5f 49 6e 74 65 Handler(Tcl_Inte
68d0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f rp *interp, Tcl_
68e0: 4f 62 6a 20 2a 63 6d 64 4f 62 6a 2c 20 63 6f 6e Obj *cmdObj, con
68f0: 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 2c 0a 09 st EVP_MD *md,..
6900: 63 6f 6e 73 74 20 45 56 50 5f 43 49 50 48 45 52 const EVP_CIPHER
6910: 20 2a 63 69 70 68 65 72 2c 20 69 6e 74 20 66 6f *cipher, int fo
6920: 72 6d 61 74 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b rmat, Tcl_Obj *k
6930: 65 79 4f 62 6a 2c 20 45 56 50 5f 4d 41 43 20 2a eyObj, EVP_MAC *
6940: 6d 61 63 29 20 7b 0a 20 20 20 20 44 69 67 65 73 mac) {. Diges
6950: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 tState *statePtr
6960: 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 6d 64 4e ;. char *cmdN
6970: 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 ame = Tcl_GetStr
6980: 69 6e 67 46 72 6f 6d 4f 62 6a 28 63 6d 64 4f 62 ingFromObj(cmdOb
6990: 6a 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 64 j, NULL);.. d
69a0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
69b0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 ;.. /* Create
69c0: 20 73 74 61 74 65 20 64 61 74 61 20 73 74 72 75 state data stru
69d0: 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 66 20 cture */. if
69e0: 28 28 73 74 61 74 65 50 74 72 20 3d 20 44 69 67 ((statePtr = Dig
69f0: 65 73 74 53 74 61 74 65 4e 65 77 28 69 6e 74 65 estStateNew(inte
6a00: 72 70 2c 20 66 6f 72 6d 61 74 29 29 20 3d 3d 20 rp, format)) ==
6a10: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 NULL) {..Tcl_App
6a20: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
6a30: 2c 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 , "Memory alloca
6a40: 74 69 6f 6e 20 65 72 72 6f 72 22 2c 20 28 63 68 tion error", (ch
6a50: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 ar *) NULL);..re
6a60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
6a70: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e }.. /* In
6a80: 69 74 69 61 6c 69 7a 65 20 68 61 73 68 20 66 75 itialize hash fu
6a90: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 nction */. if
6aa0: 20 28 44 69 67 65 73 74 49 6e 69 74 69 61 6c 69 (DigestInitiali
6ab0: 7a 65 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 ze(interp, state
6ac0: 50 74 72 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c Ptr, md, cipher,
6ad0: 20 6b 65 79 4f 62 6a 2c 20 6d 61 63 29 20 21 3d keyObj, mac) !=
6ae0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
6af0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
6b00: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 }.. /* Crea
6b10: 74 65 20 69 6e 73 74 61 6e 63 65 20 63 6f 6d 6d te instance comm
6b20: 61 6e 64 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 and */. state
6b30: 50 74 72 2d 3e 74 6f 6b 65 6e 20 3d 20 54 63 6c Ptr->token = Tcl
6b40: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
6b50: 64 28 69 6e 74 65 72 70 2c 20 63 6d 64 4e 61 6d d(interp, cmdNam
6b60: 65 2c 20 44 69 67 65 73 74 49 6e 73 74 61 6e 63 e, DigestInstanc
6b70: 65 4f 62 6a 43 6d 64 2c 0a 09 28 43 6c 69 65 6e eObjCmd,..(Clien
6b80: 74 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2c tData) statePtr,
6b90: 20 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 44 65 DigestCommandDe
6ba0: 6c 65 74 65 48 61 6e 64 6c 65 72 29 3b 0a 0a 20 leteHandler);..
6bb0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 6d /* Return com
6bc0: 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 mand name */.
6bd0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
6be0: 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 4f 62 6a t(interp, cmdObj
6bf0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
6c00: 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a L_OK;.}.../*****
6c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6c20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6c30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6c40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a **************/.
6c50: 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
6ca0: 44 69 67 65 73 74 44 61 74 61 48 61 6e 64 6c 65 DigestDataHandle
6cb0: 72 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 r --. *. *.Retur
6cc0: 6e 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 n message digest
6cd0: 20 66 6f 72 20 64 61 74 61 20 75 73 69 6e 67 20 for data using
6ce0: 75 73 65 72 20 73 70 65 63 69 66 69 65 64 20 68 user specified h
6cf0: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a ash function.. *
6d00: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 . * Returns:. *.
6d10: 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 TCL_OK or TCL_ER
6d20: 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ROR. *. * Side e
6d30: 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 ffects:. *.Sets
6d40: 72 65 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 67 result to messag
6d50: 65 20 64 69 67 65 73 74 20 6f 72 20 65 72 72 6f e digest or erro
6d60: 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d r message. *. *-
6d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6db0: 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 --. */.int Diges
6dc0: 74 44 61 74 61 48 61 6e 64 6c 65 72 28 54 63 6c tDataHandler(Tcl
6dd0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
6de0: 20 54 63 6c 5f 4f 62 6a 20 2a 64 61 74 61 4f 62 Tcl_Obj *dataOb
6df0: 6a 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 j, const EVP_MD
6e00: 2a 6d 64 2c 0a 09 63 6f 6e 73 74 20 45 56 50 5f *md,..const EVP_
6e10: 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 2c 20 CIPHER *cipher,
6e20: 69 6e 74 20 66 6f 72 6d 61 74 2c 20 54 63 6c 5f int format, Tcl_
6e30: 4f 62 6a 20 2a 6b 65 79 4f 62 6a 2c 20 45 56 50 Obj *keyObj, EVP
6e40: 5f 4d 41 43 20 2a 6d 61 63 29 20 7b 0a 20 20 20 _MAC *mac) {.
6e50: 20 63 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 20 char *data;.
6e60: 20 69 6e 74 20 64 61 74 61 5f 6c 65 6e 3b 0a 20 int data_len;.
6e70: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a DigestState *
6e80: 73 74 61 74 65 50 74 72 3b 0a 0a 20 20 20 20 64 statePtr;.. d
6e90: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
6ea0: 3b 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 64 61 ;.. /* Get da
6eb0: 74 61 20 2a 2f 0a 20 20 20 20 64 61 74 61 20 3d ta */. data =
6ec0: 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 Tcl_GetByteArra
6ed0: 79 46 72 6f 6d 4f 62 6a 28 64 61 74 61 4f 62 6a yFromObj(dataObj
6ee0: 2c 20 26 64 61 74 61 5f 6c 65 6e 29 3b 0a 20 20 , &data_len);.
6ef0: 20 20 69 66 20 28 64 61 74 61 20 3d 3d 20 4e 55 if (data == NU
6f00: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 53 65 74 52 65 LL) {..Tcl_SetRe
6f10: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f sult(interp, "No
6f20: 20 64 61 74 61 22 2c 20 4e 55 4c 4c 29 3b 0a 09 data", NULL);..
6f30: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
6f40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
6f50: 43 72 65 61 74 65 20 73 74 61 74 65 20 64 61 74 Create state dat
6f60: 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 a structure */.
6f70: 20 20 20 69 66 20 28 28 73 74 61 74 65 50 74 72 if ((statePtr
6f80: 20 3d 20 44 69 67 65 73 74 53 74 61 74 65 4e 65 = DigestStateNe
6f90: 77 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74 w(interp, format
6fa0: 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 )) == NULL) {..T
6fb0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
6fc0: 69 6e 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20 interp, "Memory
6fd0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 allocation error
6fe0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
6ff0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
7000: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
7010: 20 2f 2a 20 43 61 6c 63 20 44 69 67 65 73 74 2c /* Calc Digest,
7020: 20 61 62 6f 72 74 20 66 6f 72 20 65 72 72 6f 72 abort for error
7030: 20 2a 2f 0a 20 20 20 20 69 66 20 28 44 69 67 65 */. if (Dige
7040: 73 74 49 6e 69 74 69 61 6c 69 7a 65 28 69 6e 74 stInitialize(int
7050: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 6d erp, statePtr, m
7060: 64 2c 20 63 69 70 68 65 72 2c 20 6b 65 79 4f 62 d, cipher, keyOb
7070: 6a 2c 20 6d 61 63 29 20 21 3d 20 54 43 4c 5f 4f j, mac) != TCL_O
7080: 4b 20 7c 7c 0a 09 44 69 67 65 73 74 55 70 64 61 K ||..DigestUpda
7090: 74 65 28 73 74 61 74 65 50 74 72 2c 20 64 61 74 te(statePtr, dat
70a0: 61 2c 20 28 73 69 7a 65 5f 74 29 20 64 61 74 61 a, (size_t) data
70b0: 5f 6c 65 6e 2c 20 31 29 20 21 3d 20 54 43 4c 5f _len, 1) != TCL_
70c0: 4f 4b 20 7c 7c 0a 09 44 69 67 65 73 74 46 69 6e OK ||..DigestFin
70d0: 61 6c 69 7a 65 28 69 6e 74 65 72 70 2c 20 73 74 alize(interp, st
70e0: 61 74 65 50 74 72 2c 20 4e 55 4c 4c 29 20 21 3d atePtr, NULL) !=
70f0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 44 69 67 65 TCL_OK) {..Dige
7100: 73 74 53 74 61 74 65 46 72 65 65 28 73 74 61 74 stStateFree(stat
7110: 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 ePtr);..return T
7120: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
7130: 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 . /* Clean-up
7140: 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 53 74 */. DigestSt
7150: 61 74 65 46 72 65 65 28 73 74 61 74 65 50 74 72 ateFree(statePtr
7160: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
7170: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a L_OK;.}../******
7180: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7190: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
71a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
71b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a *************/..
71c0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
71d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
71e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
71f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7200: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 --------. *. * D
7210: 69 67 65 73 74 46 69 6c 65 48 61 6e 64 6c 65 72 igestFileHandler
7220: 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e --. *. *.Return
7230: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 message digest
7240: 66 6f 72 20 66 69 6c 65 20 75 73 69 6e 67 20 75 for file using u
7250: 73 65 72 20 73 70 65 63 69 66 69 65 64 20 68 61 ser specified ha
7260: 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a sh function.. *.
7270: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 * Returns:. *.T
7280: 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 CL_OK or TCL_ERR
7290: 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 OR. *. * Side ef
72a0: 66 65 63 74 73 3a 0a 20 2a 09 52 65 73 75 6c 74 fects:. *.Result
72b0: 20 69 73 20 6d 65 73 73 61 67 65 20 64 69 67 65 is message dige
72c0: 73 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 st or error mess
72d0: 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d age. *. *-------
72e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
72f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
7320: 0a 69 6e 74 20 44 69 67 65 73 74 46 69 6c 65 48 .int DigestFileH
7330: 61 6e 64 6c 65 72 28 54 63 6c 5f 49 6e 74 65 72 andler(Tcl_Inter
7340: 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f p *interp, Tcl_O
7350: 62 6a 20 2a 69 6e 46 69 6c 65 4f 62 6a 2c 20 63 bj *inFileObj, c
7360: 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 2c onst EVP_MD *md,
7370: 0a 09 63 6f 6e 73 74 20 45 56 50 5f 43 49 50 48 ..const EVP_CIPH
7380: 45 52 20 2a 63 69 70 68 65 72 2c 20 69 6e 74 20 ER *cipher, int
7390: 66 6f 72 6d 61 74 2c 20 54 63 6c 5f 4f 62 6a 20 format, Tcl_Obj
73a0: 2a 6b 65 79 4f 62 6a 2c 20 45 56 50 5f 4d 41 43 *keyObj, EVP_MAC
73b0: 20 2a 6d 61 63 29 20 7b 0a 20 20 20 20 44 69 67 *mac) {. Dig
73c0: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 estState *stateP
73d0: 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e tr;. Tcl_Chan
73e0: 6e 65 6c 20 63 68 61 6e 20 3d 20 4e 55 4c 4c 3b nel chan = NULL;
73f0: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 . unsigned ch
7400: 61 72 20 62 75 66 5b 42 55 46 46 45 52 5f 53 49 ar buf[BUFFER_SI
7410: 5a 45 5d 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 ZE];. int res
7420: 20 3d 20 54 43 4c 5f 4f 4b 2c 20 6c 65 6e 3b 0a = TCL_OK, len;.
7430: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
7440: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 lled");.. /*
7450: 43 72 65 61 74 65 20 73 74 61 74 65 20 64 61 74 Create state dat
7460: 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 a structure */.
7470: 20 20 20 69 66 20 28 28 73 74 61 74 65 50 74 72 if ((statePtr
7480: 20 3d 20 44 69 67 65 73 74 53 74 61 74 65 4e 65 = DigestStateNe
7490: 77 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74 w(interp, format
74a0: 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 )) == NULL) {..T
74b0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
74c0: 69 6e 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20 interp, "Memory
74d0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 allocation error
74e0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
74f0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
7500: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
7510: 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 63 68 /* Open file ch
7520: 61 6e 6e 65 6c 2c 20 61 62 6f 72 74 20 66 6f 72 annel, abort for
7530: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 63 68 error */. ch
7540: 61 6e 20 3d 20 54 63 6c 5f 46 53 4f 70 65 6e 46 an = Tcl_FSOpenF
7550: 69 6c 65 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 ileChannel(inter
7560: 70 2c 20 69 6e 46 69 6c 65 4f 62 6a 2c 20 22 72 p, inFileObj, "r
7570: 62 22 2c 20 30 34 34 34 29 3b 0a 20 20 20 20 69 b", 0444);. i
7580: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
7590: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
75a0: 0a 09 44 69 67 65 73 74 53 74 61 74 65 46 72 65 ..DigestStateFre
75b0: 65 28 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 e(statePtr);..re
75c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
75d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f }.. /* Co
75e0: 6e 66 69 67 75 72 65 20 63 68 61 6e 6e 65 6c 20 nfigure channel
75f0: 2a 2f 0a 20 20 20 20 69 66 20 28 28 72 65 73 20 */. if ((res
7600: 3d 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c = Tcl_SetChannel
7610: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 Option(interp, c
7620: 68 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 han, "-translati
7630: 6f 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 29 20 on", "binary"))
7640: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 67 6f != TCL_OK) {..go
7650: 74 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 to done;. }.
7660: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 Tcl_SetChanne
7670: 6c 42 75 66 66 65 72 53 69 7a 65 28 63 68 61 6e lBufferSize(chan
7680: 2c 20 42 55 46 46 45 52 5f 53 49 5a 45 29 3b 0a , BUFFER_SIZE);.
7690: 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 . /* Initiali
76a0: 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e ze hash function
76b0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 72 65 73 */. if ((res
76c0: 20 3d 20 44 69 67 65 73 74 49 6e 69 74 69 61 6c = DigestInitial
76d0: 69 7a 65 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ize(interp, stat
76e0: 65 50 74 72 2c 20 6d 64 2c 20 63 69 70 68 65 72 ePtr, md, cipher
76f0: 2c 20 6b 65 79 4f 62 6a 2c 20 6d 61 63 29 29 20 , keyObj, mac))
7700: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 67 6f != TCL_OK) {..go
7710: 74 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 0a to done;. }..
7720: 20 20 20 20 2f 2a 20 52 65 61 64 20 66 69 6c 65 /* Read file
7730: 20 64 61 74 61 20 61 6e 64 20 75 70 64 61 74 65 data and update
7740: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a hash function *
7750: 2f 0a 20 20 20 20 77 68 69 6c 65 20 28 21 54 63 /. while (!Tc
7760: 6c 5f 45 6f 66 28 63 68 61 6e 29 29 20 7b 0a 09 l_Eof(chan)) {..
7770: 6c 65 6e 20 3d 20 54 63 6c 5f 52 65 61 64 52 61 len = Tcl_ReadRa
7780: 77 28 63 68 61 6e 2c 20 28 63 68 61 72 20 2a 29 w(chan, (char *)
7790: 20 62 75 66 2c 20 42 55 46 46 45 52 5f 53 49 5a buf, BUFFER_SIZ
77a0: 45 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e 20 30 E);..if (len > 0
77b0: 29 20 7b 0a 09 20 20 20 20 69 66 20 28 44 69 67 ) {.. if (Dig
77c0: 65 73 74 55 70 64 61 74 65 28 73 74 61 74 65 50 estUpdate(stateP
77d0: 74 72 2c 20 26 62 75 66 5b 30 5d 2c 20 28 73 69 tr, &buf[0], (si
77e0: 7a 65 5f 74 29 20 6c 65 6e 2c 20 31 29 20 21 3d ze_t) len, 1) !=
77f0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72 65 73 TCL_OK) {...res
7800: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 = TCL_ERROR;...
7810: 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 20 20 20 20 goto done;..
7820: 7d 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 }..}. }..
7830: 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 68 61 73 68 /* Finalize hash
7840: 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 63 61 function and ca
7850: 6c 63 75 6c 61 74 65 20 6d 65 73 73 61 67 65 20 lculate message
7860: 64 69 67 65 73 74 20 2a 2f 0a 20 20 20 20 72 65 digest */. re
7870: 73 20 3d 20 44 69 67 65 73 74 46 69 6e 61 6c 69 s = DigestFinali
7880: 7a 65 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 ze(interp, state
7890: 50 74 72 2c 20 4e 55 4c 4c 29 3b 0a 0a 64 6f 6e Ptr, NULL);..don
78a0: 65 3a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 e:. /* Close
78b0: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 channel */. i
78c0: 66 20 28 54 63 6c 5f 43 6c 6f 73 65 28 69 6e 74 f (Tcl_Close(int
78d0: 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 erp, chan) == TC
78e0: 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 73 20 L_ERROR) {..res
78f0: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 = TCL_ERROR;.
7900: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e }.. /* Clean
7910: 2d 75 70 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 -up */. Diges
7920: 74 53 74 61 74 65 46 72 65 65 28 73 74 61 74 65 tStateFree(state
7930: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
7940: 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a res;.}../******
7950: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7960: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a *************/..
7990: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
79a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
79b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
79c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
79d0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 47 --------. *. * G
79e0: 65 74 44 69 67 65 73 74 20 2d 2d 20 47 65 74 20 etDigest -- Get
79f0: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 0a 20 message digest.
7a00: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a *. * Returns:. *
7a10: 09 45 56 50 5f 4d 44 20 2a 20 6f 72 20 4e 55 4c .EVP_MD * or NUL
7a20: 4c 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d L. *. *---------
7a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 45 ----------. */.E
7a70: 56 50 5f 4d 44 20 2a 47 65 74 44 69 67 65 73 74 VP_MD *GetDigest
7a80: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 (Tcl_Interp *int
7a90: 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 erp, Tcl_Obj *ob
7aa0: 6a 50 74 72 2c 20 69 6e 74 20 2a 66 6f 72 6d 61 jPtr, int *forma
7ab0: 74 29 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 45 t) {. const E
7ac0: 56 50 5f 4d 44 20 2a 6d 64 20 3d 20 4e 55 4c 4c VP_MD *md = NULL
7ad0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 64 69 67 65 ;. char *dige
7ae0: 73 74 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 stName = Tcl_Get
7af0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 StringFromObj(ob
7b00: 6a 50 74 72 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 jPtr, NULL);..
7b10: 20 20 69 66 20 28 64 69 67 65 73 74 4e 61 6d 65 if (digestName
7b20: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6d 64 20 != NULL) {..md
7b30: 3d 20 45 56 50 5f 67 65 74 5f 64 69 67 65 73 74 = EVP_get_digest
7b40: 62 79 6e 61 6d 65 28 64 69 67 65 73 74 4e 61 6d byname(digestNam
7b50: 65 29 3b 0a 09 69 66 20 28 6d 64 20 3d 3d 20 4e e);..if (md == N
7b60: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f ULL) {.. Tcl_
7b70: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
7b80: 65 72 70 2c 20 22 49 6e 76 61 6c 69 64 20 64 69 erp, "Invalid di
7b90: 67 65 73 74 20 5c 22 22 2c 20 64 69 67 65 73 74 gest \"", digest
7ba0: 4e 61 6d 65 2c 20 22 5c 22 22 2c 20 4e 55 4c 4c Name, "\"", NULL
7bb0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e );.. return N
7bc0: 55 4c 4c 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 ULL;..} else if
7bd0: 28 6d 64 20 3d 3d 20 45 56 50 5f 73 68 61 6b 65 (md == EVP_shake
7be0: 31 32 38 28 29 20 7c 7c 20 6d 64 20 3d 3d 20 45 128() || md == E
7bf0: 56 50 5f 73 68 61 6b 65 32 35 36 28 29 29 20 7b VP_shake256()) {
7c00: 0a 09 20 20 20 20 2a 66 6f 72 6d 61 74 20 7c 3d .. *format |=
7c10: 20 49 53 5f 58 4f 46 3b 0a 09 7d 0a 20 20 20 20 IS_XOF;..}.
7c20: 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 41 70 } else {..Tcl_Ap
7c30: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
7c40: 70 2c 20 22 4e 6f 20 64 69 67 65 73 74 20 73 70 p, "No digest sp
7c50: 65 63 69 66 69 65 64 22 2c 20 4e 55 4c 4c 29 3b ecified", NULL);
7c60: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
7c70: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
7c80: 6d 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d md;.}../*. *----
7c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
7cd0: 20 2a 0a 20 2a 20 47 65 74 43 69 70 68 65 72 20 *. * GetCipher
7ce0: 2d 2d 20 47 65 74 20 63 69 70 68 65 72 0a 20 2a -- Get cipher. *
7cf0: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 . * Returns:. *.
7d00: 45 56 50 5f 43 49 50 48 45 52 20 2a 20 6f 72 20 EVP_CIPHER * or
7d10: 4e 55 4c 4c 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d NULL. *. *------
7d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
7d60: 2f 0a 45 56 50 5f 43 49 50 48 45 52 20 2a 47 65 /.EVP_CIPHER *Ge
7d70: 74 43 69 70 68 65 72 28 54 63 6c 5f 49 6e 74 65 tCipher(Tcl_Inte
7d80: 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f rp *interp, Tcl_
7d90: 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 69 6e 74 Obj *objPtr, int
7da0: 20 2a 74 79 70 65 29 20 7b 0a 20 20 20 20 63 6f *type) {. co
7db0: 6e 73 74 20 45 56 50 5f 43 49 50 48 45 52 20 2a nst EVP_CIPHER *
7dc0: 63 69 70 68 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 cipher = NULL;.
7dd0: 20 20 20 63 68 61 72 20 2a 63 69 70 68 65 72 4e char *cipherN
7de0: 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 ame = Tcl_GetStr
7df0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 50 74 ingFromObj(objPt
7e00: 72 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 r, NULL);.. i
7e10: 66 20 28 63 69 70 68 65 72 4e 61 6d 65 20 21 3d f (cipherName !=
7e20: 20 4e 55 4c 4c 29 20 7b 0a 09 63 69 70 68 65 72 NULL) {..cipher
7e30: 20 3d 20 45 56 50 5f 67 65 74 5f 63 69 70 68 65 = EVP_get_ciphe
7e40: 72 62 79 6e 61 6d 65 28 63 69 70 68 65 72 4e 61 rbyname(cipherNa
7e50: 6d 65 29 3b 0a 09 2a 74 79 70 65 20 3d 20 54 59 me);..*type = TY
7e60: 50 45 5f 43 4d 41 43 3b 0a 09 69 66 20 28 63 69 PE_CMAC;..if (ci
7e70: 70 68 65 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a pher == NULL) {.
7e80: 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 . Tcl_AppendR
7e90: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 esult(interp, "I
7ea0: 6e 76 61 6c 69 64 20 63 69 70 68 65 72 20 5c 22 nvalid cipher \"
7eb0: 22 2c 20 63 69 70 68 65 72 4e 61 6d 65 2c 20 22 ", cipherName, "
7ec0: 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 \"", NULL);..
7ed0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d return NULL;..}
7ee0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 . } else {..T
7ef0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
7f00: 69 6e 74 65 72 70 2c 20 22 4e 6f 20 63 69 70 68 interp, "No ciph
7f10: 65 72 20 73 70 65 63 69 66 69 65 64 22 2c 20 4e er specified", N
7f20: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 ULL);..return NU
7f30: 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 LL;. }. re
7f40: 74 75 72 6e 20 63 69 70 68 65 72 3b 0a 7d 0a 0a turn cipher;.}..
7f50: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
7f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7f90: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 47 --------. *. * G
7fa0: 65 74 4b 65 79 20 2d 2d 20 47 65 74 20 6b 65 79 etKey -- Get key
7fb0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a . *. * Returns:.
7fc0: 20 2a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 *.unsigned char
7fd0: 20 2a 20 6f 72 20 4e 55 4c 4c 0a 20 2a 0a 20 2a * or NULL. *. *
7fe0: 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 75 6e 73 69 67 6e 65 64 ---. */.unsigned
8030: 20 63 68 61 72 20 2a 47 65 74 4b 65 79 28 54 63 char *GetKey(Tc
8040: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
8050: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 , Tcl_Obj *objPt
8060: 72 2c 20 69 6e 74 20 2a 74 79 70 65 29 20 7b 0a r, int *type) {.
8070: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 unsigned cha
8080: 72 20 2a 6b 65 79 20 3d 20 54 63 6c 5f 47 65 74 r *key = Tcl_Get
8090: 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a ByteArrayFromObj
80a0: 28 6f 62 6a 50 74 72 2c 20 4e 55 4c 4c 29 3b 0a (objPtr, NULL);.
80b0: 0a 20 20 20 20 69 66 20 28 6b 65 79 20 3d 3d 20 . if (key ==
80c0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 NULL) {..Tcl_App
80d0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
80e0: 2c 20 22 4e 6f 20 6b 65 79 20 73 70 65 63 69 66 , "No key specif
80f0: 69 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ied", NULL);..re
8100: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
8110: 0a 20 20 20 20 69 66 20 28 2a 74 79 70 65 20 3d . if (*type =
8120: 3d 20 54 59 50 45 5f 4d 44 29 20 7b 0a 09 2a 74 = TYPE_MD) {..*t
8130: 79 70 65 20 3d 20 54 59 50 45 5f 48 4d 41 43 3b ype = TYPE_HMAC;
8140: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
8150: 6e 20 6b 65 79 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d n key;.}../*. *-
8160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
81a0: 2d 2d 0a 20 2a 0a 20 2a 20 47 65 74 4d 41 43 20 --. *. * GetMAC
81b0: 2d 2d 20 47 65 74 20 4d 41 43 0a 20 2a 0a 20 2a -- Get MAC. *. *
81c0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 45 56 50 Returns:. *.EVP
81d0: 5f 4d 41 43 20 2a 20 6f 72 20 4e 55 4c 4c 0a 20 _MAC * or NULL.
81e0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
81f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8220: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 45 56 50 5f -------. */.EVP_
8230: 4d 41 43 20 2a 47 65 74 4d 41 43 28 54 63 6c 5f MAC *GetMAC(Tcl_
8240: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
8250: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c Tcl_Obj *objPtr,
8260: 20 69 6e 74 20 2a 74 79 70 65 29 20 7b 0a 20 20 int *type) {.
8270: 20 20 45 56 50 5f 4d 41 43 20 2a 6d 61 63 20 3d EVP_MAC *mac =
8280: 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 NULL;. char
8290: 2a 6d 61 63 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 *macName = Tcl_G
82a0: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
82b0: 6f 62 6a 50 74 72 2c 20 4e 55 4c 4c 29 3b 0a 0a objPtr, NULL);..
82c0: 20 20 20 20 69 66 20 28 6d 61 63 4e 61 6d 65 20 if (macName
82d0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 != NULL) {..if (
82e0: 73 74 72 63 6d 70 28 6d 61 63 4e 61 6d 65 2c 20 strcmp(macName,
82f0: 22 63 6d 61 63 22 29 20 3d 3d 20 30 29 20 7b 0a "cmac") == 0) {.
8300: 09 20 20 20 20 2a 74 79 70 65 20 3d 20 54 59 50 . *type = TYP
8310: 45 5f 43 4d 41 43 3b 0a 09 7d 20 65 6c 73 65 20 E_CMAC;..} else
8320: 69 66 20 28 73 74 72 63 6d 70 28 6d 61 63 4e 61 if (strcmp(macNa
8330: 6d 65 2c 20 22 68 6d 61 63 22 29 20 3d 3d 20 30 me, "hmac") == 0
8340: 29 20 7b 0a 09 20 20 20 20 2a 74 79 70 65 20 3d ) {.. *type =
8350: 20 54 59 50 45 5f 48 4d 41 43 3b 0a 09 7d 20 65 TYPE_HMAC;..} e
8360: 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 lse {.. Tcl_A
8370: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
8380: 72 70 2c 20 22 49 6e 76 61 6c 69 64 20 4d 41 43 rp, "Invalid MAC
8390: 20 5c 22 22 2c 20 6d 61 63 4e 61 6d 65 2c 20 22 \"", macName, "
83a0: 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 \"", NULL);..
83b0: 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d return NULL;..}
83c0: 0a 09 6d 61 63 20 3d 20 28 76 6f 69 64 20 2a 29 ..mac = (void *)
83d0: 20 6d 61 63 4e 61 6d 65 3b 0a 20 20 20 20 7d 20 macName;. }
83e0: 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 41 70 70 65 else {..Tcl_Appe
83f0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
8400: 20 22 4e 6f 20 4d 41 43 20 73 70 65 63 69 66 69 "No MAC specifi
8410: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 ed", NULL);..ret
8420: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
8430: 20 20 20 20 72 65 74 75 72 6e 20 6d 61 63 3b 0a return mac;.
8440: 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a }../************
8450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8480: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d *******/../*. *-
8490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
84a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
84b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
84c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
84d0: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 4d --. *. * DigestM
84e0: 61 69 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 ain --. *. *.Ret
84f0: 75 72 6e 20 6d 65 73 73 61 67 65 20 64 69 67 65 urn message dige
8500: 73 74 20 6f 72 20 4d 65 73 73 61 67 65 20 41 75 st or Message Au
8510: 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 43 6f 64 thentication Cod
8520: 65 20 28 4d 41 43 29 20 6f 66 0a 20 2a 09 64 61 e (MAC) of. *.da
8530: 74 61 20 75 73 69 6e 67 20 75 73 65 72 20 73 70 ta using user sp
8540: 65 63 69 66 69 65 64 20 68 61 73 68 20 66 75 6e ecified hash fun
8550: 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 ction.. *. * Ret
8560: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 urns:. *.TCL_OK
8570: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a or TCL_ERROR. *.
8580: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
8590: 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20 . *.Sets result
85a0: 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 to message diges
85b0: 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 t or error messa
85c0: 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ge. *. *--------
85d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
85e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
85f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
8610: 73 74 61 74 69 63 20 69 6e 74 20 44 69 67 65 73 static int Diges
8620: 74 4d 61 69 6e 28 69 6e 74 20 74 79 70 65 2c 20 tMain(int type,
8630: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
8640: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
8650: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
8660: 76 5b 5d 29 20 7b 0a 20 20 20 20 69 6e 74 20 69 v[]) {. int i
8670: 64 78 2c 20 73 74 61 72 74 20 3d 20 31 2c 20 66 dx, start = 1, f
8680: 6f 72 6d 61 74 20 3d 20 48 45 58 5f 46 4f 52 4d ormat = HEX_FORM
8690: 41 54 2c 20 72 65 73 20 3d 20 54 43 4c 5f 4f 4b AT, res = TCL_OK
86a0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ;. Tcl_Obj *c
86b0: 69 70 68 65 72 4f 62 6a 20 3d 20 4e 55 4c 4c 2c ipherObj = NULL,
86c0: 20 2a 63 6d 64 4f 62 6a 20 3d 20 4e 55 4c 4c 2c *cmdObj = NULL,
86d0: 20 2a 64 61 74 61 4f 62 6a 20 3d 20 4e 55 4c 4c *dataObj = NULL
86e0: 2c 20 2a 64 69 67 65 73 74 4f 62 6a 20 3d 20 4e , *digestObj = N
86f0: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a ULL;. Tcl_Obj
8700: 20 2a 66 69 6c 65 4f 62 6a 20 3d 20 4e 55 4c 4c *fileObj = NULL
8710: 2c 20 2a 6b 65 79 4f 62 6a 20 3d 20 4e 55 4c 4c , *keyObj = NULL
8720: 2c 20 2a 6d 61 63 4f 62 6a 20 3d 20 4e 55 4c 4c , *macObj = NULL
8730: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 ;. const char
8740: 20 2a 63 68 61 6e 6e 65 6c 20 3d 20 4e 55 4c 4c *channel = NULL
8750: 2c 20 2a 6f 70 74 3b 0a 20 20 20 20 63 6f 6e 73 , *opt;. cons
8760: 74 20 45 56 50 5f 4d 44 20 2a 6d 64 20 3d 20 4e t EVP_MD *md = N
8770: 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 ULL;. const E
8780: 56 50 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 VP_CIPHER *ciphe
8790: 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 45 56 r = NULL;. EV
87a0: 50 5f 4d 41 43 20 2a 6d 61 63 20 3d 20 4e 55 4c P_MAC *mac = NUL
87b0: 4c 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 L;.. dprintf(
87c0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
87d0: 2f 2a 20 43 6c 65 61 72 20 69 6e 74 65 72 70 20 /* Clear interp
87e0: 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 54 63 result */. Tc
87f0: 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e l_ResetResult(in
8800: 74 65 72 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 terp);.. /* V
8810: 61 6c 69 64 61 74 65 20 61 72 67 20 63 6f 75 6e alidate arg coun
8820: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a t */. if (obj
8830: 63 20 3c 20 33 20 7c 7c 20 6f 62 6a 63 20 3e 20 c < 3 || objc >
8840: 31 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 12) {..Tcl_Wrong
8850: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
8860: 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d 62 69 6e 7c 1, objv, "?-bin|
8870: 2d 68 65 78 3f 20 3f 2d 63 69 70 68 65 72 20 6e -hex? ?-cipher n
8880: 61 6d 65 3f 20 3f 2d 64 69 67 65 73 74 20 6e 61 ame? ?-digest na
8890: 6d 65 3f 20 3f 2d 6b 65 79 20 6b 65 79 3f 20 3f me? ?-key key? ?
88a0: 2d 6d 61 63 20 6e 61 6d 65 3f 20 5b 2d 63 68 61 -mac name? [-cha
88b0: 6e 6e 65 6c 20 63 68 61 6e 20 7c 20 2d 63 6f 6d nnel chan | -com
88c0: 6d 61 6e 64 20 63 6d 64 4e 61 6d 65 20 7c 20 2d mand cmdName | -
88d0: 66 69 6c 65 20 66 69 6c 65 6e 61 6d 65 20 7c 20 file filename |
88e0: 3f 2d 64 61 74 61 3f 20 64 61 74 61 5d 22 29 3b ?-data? data]");
88f0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
8900: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
8910: 2a 20 53 70 65 63 69 61 6c 20 63 61 73 65 20 6f * Special case o
8920: 66 20 66 69 72 73 74 20 61 72 67 20 69 73 20 64 f first arg is d
8930: 69 67 65 73 74 2c 20 63 69 70 68 65 72 2c 20 6f igest, cipher, o
8940: 72 20 6d 61 63 20 2a 2f 0a 20 20 20 20 6f 70 74 r mac */. opt
8950: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
8960: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 73 74 61 FromObj(objv[sta
8970: 72 74 5d 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 rt], NULL);.
8980: 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d if (opt[0] != '-
8990: 27 29 20 7b 0a 09 69 66 20 28 74 79 70 65 20 3d ') {..if (type =
89a0: 3d 20 54 59 50 45 5f 4d 44 20 7c 7c 20 74 79 70 = TYPE_MD || typ
89b0: 65 20 3d 3d 20 54 59 50 45 5f 48 4d 41 43 29 20 e == TYPE_HMAC)
89c0: 7b 0a 09 20 20 20 20 64 69 67 65 73 74 4f 62 6a {.. digestObj
89d0: 20 3d 20 6f 62 6a 76 5b 73 74 61 72 74 5d 3b 0a = objv[start];.
89e0: 09 20 20 20 20 73 74 61 72 74 2b 2b 3b 0a 09 7d . start++;..}
89f0: 20 65 6c 73 65 20 69 66 20 28 74 79 70 65 20 3d else if (type =
8a00: 3d 20 54 59 50 45 5f 43 4d 41 43 29 20 7b 0a 09 = TYPE_CMAC) {..
8a10: 20 20 20 20 63 69 70 68 65 72 4f 62 6a 20 3d 20 cipherObj =
8a20: 6f 62 6a 76 5b 73 74 61 72 74 5d 3b 0a 09 20 20 objv[start];..
8a30: 20 20 73 74 61 72 74 2b 2b 3b 0a 09 7d 20 65 6c start++;..} el
8a40: 73 65 20 69 66 20 28 74 79 70 65 20 3d 3d 20 54 se if (type == T
8a50: 59 50 45 5f 4d 41 43 29 20 7b 0a 09 20 20 20 20 YPE_MAC) {..
8a60: 6d 61 63 4f 62 6a 20 3d 20 6f 62 6a 76 5b 73 74 macObj = objv[st
8a70: 61 72 74 5d 3b 0a 09 20 20 20 20 73 74 61 72 74 art];.. start
8a80: 2b 2b 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 ++;..}. }..
8a90: 20 20 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 73 /* Get options
8aa0: 20 2a 2f 0a 20 20 20 20 66 6f 72 20 28 69 64 78 */. for (idx
8ab0: 20 3d 20 73 74 61 72 74 3b 20 69 64 78 20 3c 20 = start; idx <
8ac0: 6f 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 objc; idx++) {..
8ad0: 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 opt = Tcl_GetStr
8ae0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b ingFromObj(objv[
8af0: 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 idx], NULL);...i
8b00: 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 f (opt[0] != '-'
8b10: 29 20 7b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a ) {.. break;.
8b20: 09 7d 0a 0a 09 4f 50 54 46 4c 41 47 28 22 2d 62 .}...OPTFLAG("-b
8b30: 69 6e 22 2c 20 66 6f 72 6d 61 74 2c 20 42 49 4e in", format, BIN
8b40: 5f 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 46 4c _FORMAT);..OPTFL
8b50: 41 47 28 22 2d 62 69 6e 61 72 79 22 2c 20 66 6f AG("-binary", fo
8b60: 72 6d 61 74 2c 20 42 49 4e 5f 46 4f 52 4d 41 54 rmat, BIN_FORMAT
8b70: 29 3b 0a 09 4f 50 54 46 4c 41 47 28 22 2d 68 65 );..OPTFLAG("-he
8b80: 78 22 2c 20 66 6f 72 6d 61 74 2c 20 48 45 58 5f x", format, HEX_
8b90: 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 46 4c 41 FORMAT);..OPTFLA
8ba0: 47 28 22 2d 68 65 78 61 64 65 63 69 6d 61 6c 22 G("-hexadecimal"
8bb0: 2c 20 66 6f 72 6d 61 74 2c 20 48 45 58 5f 46 4f , format, HEX_FO
8bc0: 52 4d 41 54 29 3b 0a 09 4f 50 54 53 54 52 28 22 RMAT);..OPTSTR("
8bd0: 2d 63 68 61 6e 22 2c 20 63 68 61 6e 6e 65 6c 29 -chan", channel)
8be0: 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 68 61 6e ;..OPTSTR("-chan
8bf0: 6e 65 6c 22 2c 20 63 68 61 6e 6e 65 6c 29 3b 0a nel", channel);.
8c00: 09 4f 50 54 4f 42 4a 28 22 2d 63 69 70 68 65 72 .OPTOBJ("-cipher
8c10: 22 2c 20 63 69 70 68 65 72 4f 62 6a 29 3b 0a 09 ", cipherObj);..
8c20: 4f 50 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 OPTOBJ("-command
8c30: 22 2c 20 63 6d 64 4f 62 6a 29 3b 0a 09 4f 50 54 ", cmdObj);..OPT
8c40: 4f 42 4a 28 22 2d 64 61 74 61 22 2c 20 64 61 74 OBJ("-data", dat
8c50: 61 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 aObj);..OPTOBJ("
8c60: 2d 64 69 67 65 73 74 22 2c 20 64 69 67 65 73 74 -digest", digest
8c70: 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d Obj);..OPTOBJ("-
8c80: 66 69 6c 65 22 2c 20 66 69 6c 65 4f 62 6a 29 3b file", fileObj);
8c90: 0a 09 4f 50 54 4f 42 4a 28 22 2d 66 69 6c 65 6e ..OPTOBJ("-filen
8ca0: 61 6d 65 22 2c 20 66 69 6c 65 4f 62 6a 29 3b 0a ame", fileObj);.
8cb0: 09 4f 50 54 4f 42 4a 28 22 2d 6b 65 79 22 2c 20 .OPTOBJ("-key",
8cc0: 6b 65 79 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a keyObj);..OPTOBJ
8cd0: 28 22 2d 6d 61 63 22 2c 20 6d 61 63 4f 62 6a 29 ("-mac", macObj)
8ce0: 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 ;...OPTBAD("opti
8cf0: 6f 6e 22 2c 20 22 2d 62 69 6e 2c 20 2d 63 68 61 on", "-bin, -cha
8d00: 6e 6e 65 6c 2c 20 2d 63 69 70 68 65 72 2c 20 2d nnel, -cipher, -
8d10: 63 6f 6d 6d 61 6e 64 2c 20 2d 64 61 74 61 2c 20 command, -data,
8d20: 2d 64 69 67 65 73 74 2c 20 2d 66 69 6c 65 2c 20 -digest, -file,
8d30: 2d 66 69 6c 65 6e 61 6d 65 2c 20 2d 68 65 78 2c -filename, -hex,
8d40: 20 2d 6b 65 79 2c 20 6f 72 20 2d 6d 61 63 22 29 -key, or -mac")
8d50: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
8d60: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
8d70: 2f 2a 20 49 66 20 6f 6e 6c 79 20 31 20 61 72 67 /* If only 1 arg
8d80: 20 6c 65 66 74 2c 20 69 74 27 73 20 74 68 65 20 left, it's the
8d90: 64 61 74 61 20 2a 2f 0a 20 20 20 20 69 66 20 28 data */. if (
8da0: 69 64 78 20 3c 20 6f 62 6a 63 20 26 26 20 64 61 idx < objc && da
8db0: 74 61 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b taObj == NULL) {
8dc0: 0a 09 64 61 74 61 4f 62 6a 20 3d 20 6f 62 6a 76 ..dataObj = objv
8dd0: 5b 69 64 78 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 [idx];. }..
8de0: 20 20 2f 2a 20 47 65 74 20 63 69 70 68 65 72 20 /* Get cipher
8df0: 2a 2f 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 */. if (ciphe
8e00: 72 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a rObj != NULL) {.
8e10: 09 69 66 20 28 28 63 69 70 68 65 72 20 3d 20 47 .if ((cipher = G
8e20: 65 74 43 69 70 68 65 72 28 69 6e 74 65 72 70 2c etCipher(interp,
8e30: 20 63 69 70 68 65 72 4f 62 6a 2c 20 26 74 79 70 cipherObj, &typ
8e40: 65 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 e)) == NULL) {..
8e50: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
8e60: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 RROR;..}. } e
8e70: 6c 73 65 20 69 66 20 28 74 79 70 65 20 3d 3d 20 lse if (type ==
8e80: 54 59 50 45 5f 43 4d 41 43 29 20 7b 0a 09 54 63 TYPE_CMAC) {..Tc
8e90: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
8ea0: 6e 74 65 72 70 2c 20 22 4e 6f 20 63 69 70 68 65 nterp, "No ciphe
8eb0: 72 20 73 70 65 63 69 66 69 65 64 22 2c 20 4e 55 r specified", NU
8ec0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
8ed0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
8ee0: 20 20 20 2f 2a 20 47 65 74 20 6d 65 73 73 61 67 /* Get messag
8ef0: 65 20 64 69 67 65 73 74 20 2a 2f 0a 20 20 20 20 e digest */.
8f00: 69 66 20 28 64 69 67 65 73 74 4f 62 6a 20 21 3d if (digestObj !=
8f10: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 28 6d NULL) {..if ((m
8f20: 64 20 3d 20 47 65 74 44 69 67 65 73 74 28 69 6e d = GetDigest(in
8f30: 74 65 72 70 2c 20 64 69 67 65 73 74 4f 62 6a 2c terp, digestObj,
8f40: 20 26 66 6f 72 6d 61 74 29 29 20 3d 3d 20 4e 55 &format)) == NU
8f50: 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 LL) {.. retur
8f60: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
8f70: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 74 } else if (t
8f80: 79 70 65 20 3d 3d 20 54 59 50 45 5f 4d 44 20 7c ype == TYPE_MD |
8f90: 7c 20 74 79 70 65 20 3d 3d 20 54 59 50 45 5f 48 | type == TYPE_H
8fa0: 4d 41 43 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 MAC) {..Tcl_Appe
8fb0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
8fc0: 20 22 4e 6f 20 64 69 67 65 73 74 20 73 70 65 63 "No digest spec
8fd0: 69 66 69 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 ified", NULL);..
8fe0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
8ff0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
9000: 47 65 74 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 Get key */. i
9010: 66 20 28 6b 65 79 4f 62 6a 20 21 3d 20 4e 55 4c f (keyObj != NUL
9020: 4c 29 20 7b 0a 09 69 66 20 28 47 65 74 4b 65 79 L) {..if (GetKey
9030: 28 69 6e 74 65 72 70 2c 20 6b 65 79 4f 62 6a 2c (interp, keyObj,
9040: 20 26 74 79 70 65 29 20 3d 3d 20 4e 55 4c 4c 29 &type) == NULL)
9050: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 {.. return T
9060: 43 4c 5f 45 52 52 4f 52 3b 09 0a 09 7d 0a 20 20 CL_ERROR;...}.
9070: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 74 79 70 } else if (typ
9080: 65 20 21 3d 20 54 59 50 45 5f 4d 44 29 20 7b 0a e != TYPE_MD) {.
9090: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
90a0: 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 6b 65 t(interp, "No ke
90b0: 79 20 73 70 65 63 69 66 69 65 64 22 2c 20 4e 55 y specified", NU
90c0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
90d0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
90e0: 20 20 20 2f 2a 20 47 65 74 20 4d 41 43 20 2a 2f /* Get MAC */
90f0: 0a 20 20 20 20 69 66 20 28 6d 61 63 4f 62 6a 20 . if (macObj
9100: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 != NULL) {..if (
9110: 28 6d 61 63 20 3d 20 47 65 74 4d 41 43 28 69 6e (mac = GetMAC(in
9120: 74 65 72 70 2c 20 6d 61 63 4f 62 6a 2c 20 26 74 terp, macObj, &t
9130: 79 70 65 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b ype)) == NULL) {
9140: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
9150: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d _ERROR;..}. }
9160: 20 65 6c 73 65 20 69 66 20 28 74 79 70 65 20 3d else if (type =
9170: 3d 20 54 59 50 45 5f 4d 41 43 29 20 7b 0a 09 54 = TYPE_MAC) {..T
9180: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
9190: 69 6e 74 65 72 70 2c 20 22 4e 6f 20 4d 41 43 20 interp, "No MAC
91a0: 73 70 65 63 69 66 69 65 64 22 2c 20 4e 55 4c 4c specified", NULL
91b0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
91c0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
91d0: 20 2f 2a 20 43 61 6c 63 20 64 69 67 65 73 74 20 /* Calc digest
91e0: 6f 6e 20 66 69 6c 65 2c 20 73 74 61 63 6b 65 64 on file, stacked
91f0: 20 63 68 61 6e 6e 65 6c 2c 20 75 73 69 6e 67 20 channel, using
9200: 69 6e 73 74 61 6e 63 65 20 63 6f 6d 6d 61 6e 64 instance command
9210: 2c 20 6f 72 20 64 61 74 61 20 62 6c 6f 62 20 2a , or data blob *
9220: 2f 0a 20 20 20 20 69 66 20 28 66 69 6c 65 4f 62 /. if (fileOb
9230: 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 j != NULL) {..re
9240: 73 20 3d 20 44 69 67 65 73 74 46 69 6c 65 48 61 s = DigestFileHa
9250: 6e 64 6c 65 72 28 69 6e 74 65 72 70 2c 20 66 69 ndler(interp, fi
9260: 6c 65 4f 62 6a 2c 20 6d 64 2c 20 63 69 70 68 65 leObj, md, ciphe
9270: 72 2c 20 66 6f 72 6d 61 74 20 7c 20 74 79 70 65 r, format | type
9280: 2c 20 6b 65 79 4f 62 6a 2c 20 6d 61 63 29 3b 0a , keyObj, mac);.
9290: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 } else if (c
92a0: 68 61 6e 6e 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 hannel != NULL)
92b0: 7b 0a 09 72 65 73 20 3d 20 44 69 67 65 73 74 43 {..res = DigestC
92c0: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 28 69 6e hannelHandler(in
92d0: 74 65 72 70 2c 20 63 68 61 6e 6e 65 6c 2c 20 6d terp, channel, m
92e0: 64 2c 20 63 69 70 68 65 72 2c 20 66 6f 72 6d 61 d, cipher, forma
92f0: 74 20 7c 20 74 79 70 65 2c 20 6b 65 79 4f 62 6a t | type, keyObj
9300: 2c 20 6d 61 63 29 3b 0a 20 20 20 20 7d 20 65 6c , mac);. } el
9310: 73 65 20 69 66 20 28 63 6d 64 4f 62 6a 20 21 3d se if (cmdObj !=
9320: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d 20 NULL) {..res =
9330: 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 48 61 6e DigestCommandHan
9340: 64 6c 65 72 28 69 6e 74 65 72 70 2c 20 63 6d 64 dler(interp, cmd
9350: 4f 62 6a 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c Obj, md, cipher,
9360: 20 66 6f 72 6d 61 74 20 7c 20 74 79 70 65 2c 20 format | type,
9370: 6b 65 79 4f 62 6a 2c 20 6d 61 63 29 3b 0a 20 20 keyObj, mac);.
9380: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 64 61 74 } else if (dat
9390: 61 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a aObj != NULL) {.
93a0: 09 72 65 73 20 3d 20 44 69 67 65 73 74 44 61 74 .res = DigestDat
93b0: 61 48 61 6e 64 6c 65 72 28 69 6e 74 65 72 70 2c aHandler(interp,
93c0: 20 64 61 74 61 4f 62 6a 2c 20 6d 64 2c 20 63 69 dataObj, md, ci
93d0: 70 68 65 72 2c 20 66 6f 72 6d 61 74 20 7c 20 74 pher, format | t
93e0: 79 70 65 2c 20 6b 65 79 4f 62 6a 2c 20 6d 61 63 ype, keyObj, mac
93f0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
9400: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
9410: 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 6f 70 t(interp, "No op
9420: 65 72 61 74 69 6f 6e 20 73 70 65 63 69 66 69 65 eration specifie
9430: 64 3a 20 55 73 65 20 2d 63 68 61 6e 6e 65 6c 2c d: Use -channel,
9440: 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 61 74 61 -command, -data
9450: 2c 20 6f 72 20 2d 66 69 6c 65 20 6f 70 74 69 6f , or -file optio
9460: 6e 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 73 20 n", NULL);..res
9470: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 = TCL_ERROR;.
9480: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 }. return re
9490: 73 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d s;.}../*. *-----
94a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
94b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
94c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
94d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
94e0: 2a 0a 20 2a 20 4d 65 73 73 61 67 65 20 44 69 67 *. * Message Dig
94f0: 65 73 74 20 61 6e 64 20 4d 65 73 73 61 67 65 20 est and Message
9500: 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 43 Authentication C
9510: 6f 64 65 20 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a ode Commands --.
9520: 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 4d 65 73 *. *.Return Mes
9530: 73 61 67 65 20 44 69 67 65 73 74 20 28 4d 44 29 sage Digest (MD)
9540: 20 6f 72 20 4d 65 73 73 61 67 65 20 41 75 74 68 or Message Auth
9550: 65 6e 74 69 63 61 74 69 6f 6e 20 43 6f 64 65 20 entication Code
9560: 28 4d 41 43 29 2e 0a 20 2a 0a 20 2a 20 52 65 74 (MAC).. *. * Ret
9570: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 urns:. *.TCL_OK
9580: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a or TCL_ERROR. *.
9590: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
95a0: 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20 . *.Sets result
95b0: 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 to message diges
95c0: 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 t or error messa
95d0: 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ge. *. *--------
95e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
95f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
9620: 73 74 61 74 69 63 20 69 6e 74 20 4d 64 4f 62 6a static int MdObj
9630: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
9640: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
9650: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
9660: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
9670: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
9680: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69 67 {. return Dig
9690: 65 73 74 4d 61 69 6e 28 54 59 50 45 5f 4d 44 2c estMain(TYPE_MD,
96a0: 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f interp, objc, o
96b0: 62 6a 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 bjv);.}..static
96c0: 69 6e 74 20 43 4d 41 43 4f 62 6a 43 6d 64 28 43 int CMACObjCmd(C
96d0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
96e0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
96f0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
9700: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
9710: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
9720: 20 72 65 74 75 72 6e 20 44 69 67 65 73 74 4d 61 return DigestMa
9730: 69 6e 28 54 59 50 45 5f 43 4d 41 43 2c 20 69 6e in(TYPE_CMAC, in
9740: 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 terp, objc, objv
9750: 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 );.}..static int
9760: 20 48 4d 41 43 4f 62 6a 43 6d 64 28 43 6c 69 65 HMACObjCmd(Clie
9770: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
9780: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
9790: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
97a0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
97b0: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 objv[]) {. re
97c0: 74 75 72 6e 20 44 69 67 65 73 74 4d 61 69 6e 28 turn DigestMain(
97d0: 54 59 50 45 5f 48 4d 41 43 2c 20 69 6e 74 65 72 TYPE_HMAC, inter
97e0: 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a p, objc, objv);.
97f0: 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 4d 41 }..static int MA
9800: 43 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 CObjCmd(ClientDa
9810: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
9820: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
9830: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
9840: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
9850: 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e []) {. return
9860: 20 44 69 67 65 73 74 4d 61 69 6e 28 54 59 50 45 DigestMain(TYPE
9870: 5f 4d 41 43 2c 20 69 6e 74 65 72 70 2c 20 6f 62 _MAC, interp, ob
9880: 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 0a 2f 2a jc, objv);.}../*
9890: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
98a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
98b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
98c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
98d0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 ------. *. * Mes
98e0: 73 61 67 65 20 44 69 67 65 73 74 20 43 6f 6e 76 sage Digest Conv
98f0: 65 6e 69 65 6e 63 65 20 43 6f 6d 6d 61 6e 64 73 enience Commands
9900: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6e 76 65 6e --. *. *.Conven
9910: 69 65 6e 63 65 20 63 6f 6d 6d 61 6e 64 73 20 66 ience commands f
9920: 6f 72 20 73 65 6c 65 63 74 20 6d 65 73 73 61 67 or select messag
9930: 65 20 64 69 67 65 73 74 73 2e 0a 20 2a 0a 20 2a e digests.. *. *
9940: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c Returns:. *.TCL
9950: 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 _OK or TCL_ERROR
9960: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
9970: 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 cts:. *.Sets res
9980: 75 6c 74 20 74 6f 20 6d 65 73 73 61 67 65 20 64 ult to message d
9990: 69 67 65 73 74 20 6f 72 20 65 72 72 6f 72 20 6d igest or error m
99a0: 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d essage. *. *----
99b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
99c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
99d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
99e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
99f0: 20 2a 2f 0a 20 23 64 65 66 69 6e 65 20 76 61 6c */. #define val
9a00: 69 64 61 74 65 5f 61 72 67 63 28 6f 62 6a 63 2c idate_argc(objc,
9a10: 20 6f 62 6a 76 29 20 7b 20 5c 0a 20 20 20 20 69 objv) { \. i
9a20: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 20 f (objc != 2) {
9a30: 5c 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 \..Tcl_WrongNumA
9a40: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
9a50: 62 6a 76 2c 20 22 64 61 74 61 22 29 3b 20 5c 0a bjv, "data"); \.
9a60: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
9a70: 52 3b 20 5c 0a 20 20 20 20 7d 20 5c 0a 7d 0a 20 R; \. } \.}.
9a80: 0a 69 6e 74 20 4d 44 34 4f 62 6a 43 6d 64 28 43 .int MD4ObjCmd(C
9a90: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
9aa0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
9ab0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
9ac0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
9ad0: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
9ae0: 20 76 61 6c 69 64 61 74 65 5f 61 72 67 63 28 6f validate_argc(o
9af0: 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 20 20 20 20 bjc, objv);.
9b00: 72 65 74 75 72 6e 20 44 69 67 65 73 74 44 61 74 return DigestDat
9b10: 61 48 61 6e 64 6c 65 72 28 69 6e 74 65 72 70 2c aHandler(interp,
9b20: 20 6f 62 6a 76 5b 31 5d 2c 20 45 56 50 5f 6d 64 objv[1], EVP_md
9b30: 34 28 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f 46 4(), NULL, HEX_F
9b40: 4f 52 4d 41 54 20 7c 20 54 59 50 45 5f 4d 44 2c ORMAT | TYPE_MD,
9b50: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a NULL, NULL);.}.
9b60: 0a 69 6e 74 20 4d 44 35 4f 62 6a 43 6d 64 28 43 .int MD5ObjCmd(C
9b70: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
9b80: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
9b90: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
9ba0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
9bb0: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
9bc0: 20 76 61 6c 69 64 61 74 65 5f 61 72 67 63 28 6f validate_argc(o
9bd0: 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 20 20 20 20 bjc, objv);.
9be0: 72 65 74 75 72 6e 20 44 69 67 65 73 74 44 61 74 return DigestDat
9bf0: 61 48 61 6e 64 6c 65 72 28 69 6e 74 65 72 70 2c aHandler(interp,
9c00: 20 6f 62 6a 76 5b 31 5d 2c 20 45 56 50 5f 6d 64 objv[1], EVP_md
9c10: 35 28 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f 46 5(), NULL, HEX_F
9c20: 4f 52 4d 41 54 20 7c 20 54 59 50 45 5f 4d 44 2c ORMAT | TYPE_MD,
9c30: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a NULL, NULL);.}.
9c40: 0a 69 6e 74 20 53 48 41 31 4f 62 6a 43 6d 64 28 .int SHA1ObjCmd(
9c50: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
9c60: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
9c70: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
9c80: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
9c90: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
9ca0: 20 20 76 61 6c 69 64 61 74 65 5f 61 72 67 63 28 validate_argc(
9cb0: 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 20 20 20 objc, objv);.
9cc0: 20 72 65 74 75 72 6e 20 44 69 67 65 73 74 44 61 return DigestDa
9cd0: 74 61 48 61 6e 64 6c 65 72 28 69 6e 74 65 72 70 taHandler(interp
9ce0: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 45 56 50 5f 73 , objv[1], EVP_s
9cf0: 68 61 31 28 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 ha1(), NULL, HEX
9d00: 5f 46 4f 52 4d 41 54 20 7c 20 54 59 50 45 5f 4d _FORMAT | TYPE_M
9d10: 44 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a D, NULL, NULL);.
9d20: 7d 0a 0a 69 6e 74 20 53 48 41 32 35 36 4f 62 6a }..int SHA256Obj
9d30: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
9d40: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
9d50: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
9d60: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
9d70: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
9d80: 7b 0a 20 20 20 20 76 61 6c 69 64 61 74 65 5f 61 {. validate_a
9d90: 72 67 63 28 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b rgc(objc, objv);
9da0: 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69 67 65 . return Dige
9db0: 73 74 44 61 74 61 48 61 6e 64 6c 65 72 28 69 6e stDataHandler(in
9dc0: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 45 terp, objv[1], E
9dd0: 56 50 5f 73 68 61 32 35 36 28 29 2c 20 4e 55 4c VP_sha256(), NUL
9de0: 4c 2c 20 48 45 58 5f 46 4f 52 4d 41 54 20 7c 20 L, HEX_FORMAT |
9df0: 54 59 50 45 5f 4d 44 2c 20 4e 55 4c 4c 2c 20 4e TYPE_MD, NULL, N
9e00: 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 53 48 41 ULL);.}..int SHA
9e10: 35 31 32 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 512ObjCmd(Client
9e20: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
9e30: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
9e40: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
9e50: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
9e60: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 76 61 6c 69 jv[]) {. vali
9e70: 64 61 74 65 5f 61 72 67 63 28 6f 62 6a 63 2c 20 date_argc(objc,
9e80: 6f 62 6a 76 29 3b 0a 20 20 20 20 72 65 74 75 72 objv);. retur
9e90: 6e 20 44 69 67 65 73 74 44 61 74 61 48 61 6e 64 n DigestDataHand
9ea0: 6c 65 72 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 ler(interp, objv
9eb0: 5b 31 5d 2c 20 45 56 50 5f 73 68 61 35 31 32 28 [1], EVP_sha512(
9ec0: 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f 46 4f 52 ), NULL, HEX_FOR
9ed0: 4d 41 54 20 7c 20 54 59 50 45 5f 4d 44 2c 20 4e MAT | TYPE_MD, N
9ee0: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f ULL, NULL);.}../
9ef0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
9f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9f30: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
9f40: 73 5f 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 73 s_DigestCommands
9f50: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65 --. *. *.Create
9f60: 20 64 69 67 65 73 74 20 63 6f 6d 6d 61 6e 64 73 digest commands
9f70: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a . *. * Returns:.
9f80: 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c *.TCL_OK or TCL
9f90: 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 _ERROR. *. * Sid
9fa0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 72 e effects:. *.Cr
9fb0: 65 61 74 65 73 20 63 6f 6d 6d 61 6e 64 73 0a 20 eates commands.
9fc0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
9fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a000: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 -------. */.int
a010: 54 6c 73 5f 44 69 67 65 73 74 43 6f 6d 6d 61 6e Tls_DigestComman
a020: 64 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 ds(Tcl_Interp *i
a030: 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 54 63 6c nterp) {. Tcl
a040: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
a050: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
a060: 64 69 67 65 73 74 22 2c 20 4d 64 4f 62 6a 43 6d digest", MdObjCm
a070: 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
a080: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
a090: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
a0a0: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
a0b0: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
a0c0: 20 22 74 6c 73 3a 3a 6d 64 22 2c 20 4d 64 4f 62 "tls::md", MdOb
a0d0: 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
a0e0: 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 a) 0, (Tcl_CmdDe
a0f0: 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
a100: 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
a110: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
a120: 72 70 2c 20 22 74 6c 73 3a 3a 63 6d 61 63 22 2c rp, "tls::cmac",
a130: 20 43 4d 41 43 4f 62 6a 43 6d 64 2c 20 28 43 6c CMACObjCmd, (Cl
a140: 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
a150: 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
a160: 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
a170: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
a180: 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
a190: 3a 68 6d 61 63 22 2c 20 48 4d 41 43 4f 62 6a 43 :hmac", HMACObjC
a1a0: 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
a1b0: 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
a1c0: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
a1d0: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
a1e0: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
a1f0: 2c 20 22 74 6c 73 3a 3a 6d 61 63 22 2c 20 4d 41 , "tls::mac", MA
a200: 43 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 CObjCmd, (Client
a210: 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d Data) 0, (Tcl_Cm
a220: 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
a230: 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
a240: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
a250: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 64 34 nterp, "tls::md4
a260: 22 2c 20 4d 44 34 4f 62 6a 43 6d 64 2c 20 28 43 ", MD4ObjCmd, (C
a270: 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
a280: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
a290: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
a2a0: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
a2b0: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
a2c0: 3a 3a 6d 64 35 22 2c 20 4d 44 35 4f 62 6a 43 6d ::md5", MD5ObjCm
a2d0: 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
a2e0: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
a2f0: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
a300: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
a310: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
a320: 20 22 74 6c 73 3a 3a 73 68 61 31 22 2c 20 53 48 "tls::sha1", SH
a330: 41 31 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e A1ObjCmd, (Clien
a340: 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
a350: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
a360: 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
a370: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
a380: 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 68 interp, "tls::sh
a390: 61 32 35 36 22 2c 20 53 48 41 32 35 36 4f 62 6a a256", SHA256Obj
a3a0: 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
a3b0: 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ) 0, (Tcl_CmdDel
a3c0: 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
a3d0: 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
a3e0: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
a3f0: 70 2c 20 22 74 6c 73 3a 3a 73 68 61 35 31 32 22 p, "tls::sha512"
a400: 2c 20 53 48 41 35 31 32 4f 62 6a 43 6d 64 2c 20 , SHA512ObjCmd,
a410: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 (ClientData) 0,
a420: 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
a430: 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
a440: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
a450: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
a460: 6c 73 3a 3a 75 6e 73 74 61 63 6b 22 2c 20 44 69 ls::unstack", Di
a470: 67 65 73 74 55 6e 73 74 61 63 6b 4f 62 6a 43 6d gestUnstackObjCm
a480: 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
a490: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
a4a0: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
a4b0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
a4c0: 4b 3b 0a 7d 0a 0a K;.}..