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 2f 2a 20 43 72 65 ULL;.. /* Cre
0ff0: 61 74 65 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a ate contexts */.
1000: 20 20 20 20 73 77 69 74 63 68 28 73 74 61 74 65 switch(state
1010: 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 30 78 Ptr->format & 0x
1020: 46 46 30 29 20 7b 0a 20 20 20 20 63 61 73 65 20 FF0) {. case
1030: 54 59 50 45 5f 4d 44 3a 0a 09 73 74 61 74 65 50 TYPE_MD:..stateP
1040: 74 72 2d 3e 63 74 78 20 3d 20 45 56 50 5f 4d 44 tr->ctx = EVP_MD
1050: 5f 43 54 58 5f 6e 65 77 28 29 3b 0a 09 72 65 73 _CTX_new();..res
1060: 20 3d 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74 = (statePtr->ct
1070: 78 20 21 3d 20 4e 55 4c 4c 29 3b 0a 09 62 72 65 x != NULL);..bre
1080: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 59 50 ak;. case TYP
1090: 45 5f 48 4d 41 43 3a 0a 09 73 74 61 74 65 50 74 E_HMAC:..statePt
10a0: 72 2d 3e 68 63 74 78 20 3d 20 48 4d 41 43 5f 43 r->hctx = HMAC_C
10b0: 54 58 5f 6e 65 77 28 29 3b 0a 09 72 65 73 20 3d TX_new();..res =
10c0: 20 28 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 (statePtr->hctx
10d0: 20 21 3d 20 4e 55 4c 4c 29 3b 0a 09 62 72 65 61 != NULL);..brea
10e0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 59 50 45 k;. case TYPE
10f0: 5f 43 4d 41 43 3a 0a 09 73 74 61 74 65 50 74 72 _CMAC:..statePtr
1100: 2d 3e 63 63 74 78 20 3d 20 43 4d 41 43 5f 43 54 ->cctx = CMAC_CT
1110: 58 5f 6e 65 77 28 29 3b 0a 09 72 65 73 20 3d 20 X_new();..res =
1120: 28 73 74 61 74 65 50 74 72 2d 3e 63 63 74 78 20 (statePtr->cctx
1130: 21 3d 20 4e 55 4c 4c 29 3b 0a 09 62 72 65 61 6b != NULL);..break
1140: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
1150: 28 21 72 65 73 29 20 7b 0a 09 54 63 6c 5f 41 70 (!res) {..Tcl_Ap
1160: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
1170: 70 2c 20 22 43 72 65 61 74 65 20 63 6f 6e 74 65 p, "Create conte
1180: 78 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45 xt failed: ", RE
1190: 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 ASON(), NULL);..
11a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
11b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
11c0: 47 65 74 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 Get key */. i
11d0: 66 20 28 6b 65 79 4f 62 6a 20 21 3d 20 4e 55 4c f (keyObj != NUL
11e0: 4c 29 20 7b 0a 09 6b 65 79 20 3d 20 54 63 6c 5f L) {..key = Tcl_
11f0: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d GetByteArrayFrom
1200: 4f 62 6a 28 6b 65 79 4f 62 6a 2c 20 26 6b 65 79 Obj(keyObj, &key
1210: 5f 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 _len);. }..
1220: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 /* Initialize
1230: 63 72 79 70 74 6f 67 72 61 70 68 79 20 66 75 6e cryptography fun
1240: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 77 69 ction */. swi
1250: 74 63 68 28 73 74 61 74 65 50 74 72 2d 3e 66 6f tch(statePtr->fo
1260: 72 6d 61 74 20 26 20 30 78 46 46 30 29 20 7b 0a rmat & 0xFF0) {.
1270: 20 20 20 20 63 61 73 65 20 54 59 50 45 5f 4d 44 case TYPE_MD
1280: 3a 0a 09 72 65 73 20 3d 20 45 56 50 5f 44 69 67 :..res = EVP_Dig
1290: 65 73 74 49 6e 69 74 5f 65 78 28 73 74 61 74 65 estInit_ex(state
12a0: 50 74 72 2d 3e 63 74 78 2c 20 6d 64 2c 20 4e 55 Ptr->ctx, md, NU
12b0: 4c 4c 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 LL);..break;.
12c0: 20 63 61 73 65 20 54 59 50 45 5f 48 4d 41 43 3a case TYPE_HMAC:
12d0: 0a 09 72 65 73 20 3d 20 48 4d 41 43 5f 49 6e 69 ..res = HMAC_Ini
12e0: 74 5f 65 78 28 73 74 61 74 65 50 74 72 2d 3e 68 t_ex(statePtr->h
12f0: 63 74 78 2c 20 28 63 6f 6e 73 74 20 76 6f 69 64 ctx, (const void
1300: 20 2a 29 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e *) key, key_len
1310: 2c 20 6d 64 2c 20 4e 55 4c 4c 29 3b 0a 09 62 72 , md, NULL);..br
1320: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 59 eak;. case TY
1330: 50 45 5f 43 4d 41 43 3a 0a 09 72 65 73 20 3d 20 PE_CMAC:..res =
1340: 43 4d 41 43 5f 49 6e 69 74 28 73 74 61 74 65 50 CMAC_Init(stateP
1350: 74 72 2d 3e 63 63 74 78 2c 20 28 63 6f 6e 73 74 tr->cctx, (const
1360: 20 76 6f 69 64 20 2a 29 20 6b 65 79 2c 20 6b 65 void *) key, ke
1370: 79 5f 6c 65 6e 2c 20 63 69 70 68 65 72 2c 20 4e y_len, cipher, N
1380: 55 4c 4c 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 ULL);..break;.
1390: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 21 72 65 }.. if (!re
13a0: 73 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 s) {..Tcl_Append
13b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
13c0: 49 6e 69 74 69 61 6c 69 7a 65 20 66 61 69 6c 65 Initialize faile
13d0: 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 d: ", REASON(),
13e0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
13f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
1400: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
1410: 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d K;.}../*. *-----
1420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
1460: 2a 0a 20 2a 20 44 69 67 65 73 74 55 70 64 61 74 *. * DigestUpdat
1470: 65 20 2d 2d 0a 20 2a 0a 20 2a 09 55 70 64 61 74 e --. *. *.Updat
1480: 65 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f e a hash functio
1490: 6e 20 77 69 74 68 20 64 61 74 61 0a 20 2a 0a 20 n with data. *.
14a0: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 31 20 * Returns:. *.1
14b0: 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 if successful or
14c0: 20 30 20 66 6f 72 20 66 61 69 6c 75 72 65 0a 20 0 for failure.
14d0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
14e0: 73 3a 0a 20 2a 09 41 64 64 73 20 62 75 66 20 64 s:. *.Adds buf d
14f0: 61 74 61 20 74 6f 20 68 61 73 68 20 66 75 6e 63 ata to hash func
1500: 74 69 6f 6e 20 6f 72 20 73 65 74 73 20 72 65 73 tion or sets res
1510: 75 6c 74 20 74 6f 20 65 72 72 6f 72 20 6d 65 73 ult to error mes
1520: 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d sage. *. *------
1530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
1570: 2f 0a 69 6e 74 20 44 69 67 65 73 74 55 70 64 61 /.int DigestUpda
1580: 74 65 28 44 69 67 65 73 74 53 74 61 74 65 20 2a te(DigestState *
1590: 73 74 61 74 65 50 74 72 2c 20 63 68 61 72 20 2a statePtr, char *
15a0: 62 75 66 2c 20 73 69 7a 65 5f 74 20 72 65 61 64 buf, size_t read
15b0: 2c 20 69 6e 74 20 64 6f 5f 72 65 73 75 6c 74 29 , int do_result)
15c0: 20 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d {. int res =
15d0: 20 30 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 28 0;.. switch(
15e0: 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 statePtr->format
15f0: 20 26 20 30 78 46 46 30 29 20 7b 0a 20 20 20 20 & 0xFF0) {.
1600: 63 61 73 65 20 54 59 50 45 5f 4d 44 3a 0a 20 20 case TYPE_MD:.
1610: 20 20 20 20 20 20 72 65 73 20 3d 20 45 56 50 5f res = EVP_
1620: 44 69 67 65 73 74 55 70 64 61 74 65 28 73 74 61 DigestUpdate(sta
1630: 74 65 50 74 72 2d 3e 63 74 78 2c 20 62 75 66 2c tePtr->ctx, buf,
1640: 20 72 65 61 64 29 3b 0a 09 62 72 65 61 6b 3b 0a read);..break;.
1650: 20 20 20 20 63 61 73 65 20 54 59 50 45 5f 48 4d case TYPE_HM
1660: 41 43 3a 0a 20 20 20 20 20 20 20 20 72 65 73 20 AC:. res
1670: 3d 20 48 4d 41 43 5f 55 70 64 61 74 65 28 73 74 = HMAC_Update(st
1680: 61 74 65 50 74 72 2d 3e 68 63 74 78 2c 20 62 75 atePtr->hctx, bu
1690: 66 2c 20 72 65 61 64 29 3b 0a 09 62 72 65 61 6b f, read);..break
16a0: 3b 0a 20 20 20 20 63 61 73 65 20 54 59 50 45 5f ;. case TYPE_
16b0: 43 4d 41 43 3a 0a 20 20 20 20 20 20 20 20 72 65 CMAC:. re
16c0: 73 20 3d 20 43 4d 41 43 5f 55 70 64 61 74 65 28 s = CMAC_Update(
16d0: 73 74 61 74 65 50 74 72 2d 3e 63 63 74 78 2c 20 statePtr->cctx,
16e0: 62 75 66 2c 20 72 65 61 64 29 3b 0a 09 62 72 65 buf, read);..bre
16f0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 ak;. }.. i
1700: 66 20 28 21 72 65 73 20 26 26 20 64 6f 5f 72 65 f (!res && do_re
1710: 73 75 6c 74 29 20 7b 0a 09 54 63 6c 5f 41 70 70 sult) {..Tcl_App
1720: 65 6e 64 52 65 73 75 6c 74 28 73 74 61 74 65 50 endResult(stateP
1730: 74 72 2d 3e 69 6e 74 65 72 70 2c 20 22 55 70 64 tr->interp, "Upd
1740: 61 74 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 ate failed: ", R
1750: 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a EASON(), NULL);.
1760: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
1770: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 R;. }. ret
1780: 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 20 urn res;.}../*.
1790: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
17a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17d0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 ----. *. * Diges
17e0: 74 46 69 6e 61 6c 69 7a 65 20 2d 2d 0a 20 2a 0a tFinalize --. *.
17f0: 20 2a 09 46 69 6e 61 6c 69 7a 65 20 61 20 68 61 *.Finalize a ha
1800: 73 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 sh function and
1810: 72 65 74 75 72 6e 20 74 68 65 20 6d 65 73 73 61 return the messa
1820: 67 65 20 64 69 67 65 73 74 0a 20 2a 0a 20 2a 20 ge digest. *. *
1830: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f Returns:. *.TCL_
1840: 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c OK if successful
1850: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 66 6f or TCL_ERROR fo
1860: 72 20 66 61 69 6c 75 72 65 20 77 69 74 68 20 72 r failure with r
1870: 65 73 75 6c 74 20 73 65 74 0a 20 2a 09 74 6f 20 esult set. *.to
1880: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 error message..
1890: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
18a0: 73 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c s:. *.Sets resul
18b0: 74 20 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 t to message dig
18c0: 65 73 74 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 est or an error
18d0: 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 2d 2d message.. *. *--
18e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
18f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1920: 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 -. */.int Digest
1930: 46 69 6e 61 6c 69 7a 65 28 54 63 6c 5f 49 6e 74 Finalize(Tcl_Int
1940: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 44 69 67 erp *interp, Dig
1950: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 estState *stateP
1960: 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 2a 72 65 tr, Tcl_Obj **re
1970: 73 75 6c 74 4f 62 6a 29 20 7b 0a 20 20 20 20 75 sultObj) {. u
1980: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 64 5f nsigned char md_
1990: 62 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 buf[EVP_MAX_MD_S
19a0: 49 5a 45 5d 3b 0a 20 20 20 20 75 6e 73 69 67 6e IZE];. unsign
19b0: 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 20 20 20 ed int ulen;.
19c0: 20 69 6e 74 20 72 65 73 20 3d 20 30 2c 20 6d 64 int res = 0, md
19d0: 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 2f _len = 0;.. /
19e0: 2a 20 46 69 6e 61 6c 69 7a 65 20 63 72 79 70 74 * Finalize crypt
19f0: 6f 67 72 61 70 68 79 20 66 75 6e 63 74 69 6f 6e ography function
1a00: 20 61 6e 64 20 67 65 74 20 72 65 73 75 6c 74 20 and get result
1a10: 2a 2f 0a 20 20 20 20 73 77 69 74 63 68 28 73 74 */. switch(st
1a20: 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 atePtr->format &
1a30: 20 30 78 46 46 30 29 20 7b 0a 20 20 20 20 63 61 0xFF0) {. ca
1a40: 73 65 20 54 59 50 45 5f 4d 44 3a 0a 09 69 66 20 se TYPE_MD:..if
1a50: 28 21 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 (!(statePtr->for
1a60: 6d 61 74 20 26 20 49 53 5f 58 4f 46 29 29 20 7b mat & IS_XOF)) {
1a70: 0a 09 20 20 20 20 72 65 73 20 3d 20 45 56 50 5f .. res = EVP_
1a80: 44 69 67 65 73 74 46 69 6e 61 6c 5f 65 78 28 73 DigestFinal_ex(s
1a90: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 6d 64 tatePtr->ctx, md
1aa0: 5f 62 75 66 2c 20 26 75 6c 65 6e 29 3b 0a 09 20 _buf, &ulen);..
1ab0: 20 20 20 6d 64 5f 6c 65 6e 20 3d 20 28 69 6e 74 md_len = (int
1ac0: 29 20 75 6c 65 6e 3b 0a 09 7d 20 65 6c 73 65 20 ) ulen;..} else
1ad0: 7b 0a 09 20 20 20 20 72 65 73 20 3d 20 45 56 50 {.. res = EVP
1ae0: 5f 44 69 67 65 73 74 46 69 6e 61 6c 58 4f 46 28 _DigestFinalXOF(
1af0: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 6d statePtr->ctx, m
1b00: 64 5f 62 75 66 2c 20 28 73 69 7a 65 5f 74 29 20 d_buf, (size_t)
1b10: 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 29 EVP_MAX_MD_SIZE)
1b20: 3b 0a 09 20 20 20 20 6d 64 5f 6c 65 6e 20 3d 20 ;.. md_len =
1b30: 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 3b EVP_MAX_MD_SIZE;
1b40: 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 ..}..break;.
1b50: 63 61 73 65 20 54 59 50 45 5f 48 4d 41 43 3a 0a case TYPE_HMAC:.
1b60: 09 72 65 73 20 3d 20 48 4d 41 43 5f 46 69 6e 61 .res = HMAC_Fina
1b70: 6c 28 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 l(statePtr->hctx
1b80: 2c 20 6d 64 5f 62 75 66 2c 20 26 75 6c 65 6e 29 , md_buf, &ulen)
1b90: 3b 0a 09 6d 64 5f 6c 65 6e 20 3d 20 28 69 6e 74 ;..md_len = (int
1ba0: 29 20 75 6c 65 6e 3b 0a 09 62 72 65 61 6b 3b 0a ) ulen;..break;.
1bb0: 20 20 20 20 63 61 73 65 20 54 59 50 45 5f 43 4d case TYPE_CM
1bc0: 41 43 3a 0a 09 73 69 7a 65 5f 74 20 73 69 7a 65 AC:..size_t size
1bd0: 3b 0a 09 72 65 73 20 3d 20 43 4d 41 43 5f 46 69 ;..res = CMAC_Fi
1be0: 6e 61 6c 28 73 74 61 74 65 50 74 72 2d 3e 63 63 nal(statePtr->cc
1bf0: 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26 73 69 7a tx, md_buf, &siz
1c00: 65 29 3b 0a 09 6d 64 5f 6c 65 6e 20 3d 20 28 69 e);..md_len = (i
1c10: 6e 74 29 20 73 69 7a 65 3b 0a 09 62 72 65 61 6b nt) size;..break
1c20: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
1c30: 28 21 72 65 73 29 20 7b 0a 09 69 66 20 28 72 65 (!res) {..if (re
1c40: 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 sultObj == NULL)
1c50: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
1c60: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
1c70: 20 22 46 69 6e 61 6c 69 7a 65 20 66 61 69 6c 65 "Finalize faile
1c80: 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 d: ", REASON(),
1c90: 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 72 65 74 75 72 NULL);..}..retur
1ca0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
1cb0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 74 75 72 }.. /* Retur
1cc0: 6e 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 n message digest
1cd0: 20 61 73 20 65 69 74 68 65 72 20 61 20 62 69 6e as either a bin
1ce0: 61 72 79 20 6f 72 20 68 65 78 20 73 74 72 69 6e ary or hex strin
1cf0: 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 g */. if (sta
1d00: 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 tePtr->format &
1d10: 42 49 4e 5f 46 4f 52 4d 41 54 29 20 7b 0a 09 69 BIN_FORMAT) {..i
1d20: 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 f (resultObj ==
1d30: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c NULL) {.. Tcl
1d40: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
1d50: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 terp, Tcl_NewByt
1d60: 65 41 72 72 61 79 4f 62 6a 28 6d 64 5f 62 75 66 eArrayObj(md_buf
1d70: 2c 20 6d 64 5f 6c 65 6e 29 29 3b 0a 09 7d 20 65 , md_len));..} e
1d80: 6c 73 65 20 7b 0a 09 20 20 20 20 2a 72 65 73 75 lse {.. *resu
1d90: 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 42 ltObj = Tcl_NewB
1da0: 79 74 65 41 72 72 61 79 4f 62 6a 28 6d 64 5f 62 yteArrayObj(md_b
1db0: 75 66 2c 20 6d 64 5f 6c 65 6e 29 3b 0a 09 20 20 uf, md_len);..
1dc0: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 Tcl_IncrRefCou
1dd0: 6e 74 28 2a 72 65 73 75 6c 74 4f 62 6a 29 3b 0a nt(*resultObj);.
1de0: 09 7d 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b .}.. } else {
1df0: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6e 65 77 4f 62 ..Tcl_Obj *newOb
1e00: 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 j = Tcl_NewObj()
1e10: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 72 ;..unsigned char
1e20: 20 2a 70 74 72 20 3d 20 54 63 6c 5f 53 65 74 42 *ptr = Tcl_SetB
1e30: 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68 28 6e yteArrayLength(n
1e40: 65 77 4f 62 6a 2c 20 6d 64 5f 6c 65 6e 2a 32 29 ewObj, md_len*2)
1e50: 3b 0a 0a 09 66 6f 72 20 28 69 6e 74 20 69 20 3d ;...for (int i =
1e60: 20 30 3b 20 69 20 3c 20 6d 64 5f 6c 65 6e 3b 20 0; i < md_len;
1e70: 69 2b 2b 29 20 7b 0a 09 20 20 20 20 2a 70 74 72 i++) {.. *ptr
1e80: 2b 2b 20 3d 20 68 65 78 5b 28 6d 64 5f 62 75 66 ++ = hex[(md_buf
1e90: 5b 69 5d 20 3e 3e 20 34 29 20 26 20 30 78 30 46 [i] >> 4) & 0x0F
1ea0: 5d 3b 0a 09 20 20 20 20 2a 70 74 72 2b 2b 20 3d ];.. *ptr++ =
1eb0: 20 68 65 78 5b 6d 64 5f 62 75 66 5b 69 5d 20 26 hex[md_buf[i] &
1ec0: 20 30 78 30 46 5d 3b 0a 09 7d 0a 0a 09 69 66 20 0x0F];..}...if
1ed0: 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 (resultObj == NU
1ee0: 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 LL) {.. Tcl_S
1ef0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
1f00: 72 70 2c 20 6e 65 77 4f 62 6a 29 3b 0a 09 7d 20 rp, newObj);..}
1f10: 65 6c 73 65 20 7b 0a 09 20 20 20 20 2a 72 65 73 else {.. *res
1f20: 75 6c 74 4f 62 6a 20 3d 20 6e 65 77 4f 62 6a 3b ultObj = newObj;
1f30: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 .. Tcl_IncrRe
1f40: 66 43 6f 75 6e 74 28 2a 72 65 73 75 6c 74 4f 62 fCount(*resultOb
1f50: 6a 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 j);..}. }.
1f60: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
1f70: 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a }../************
1f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1fa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1fb0: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d *******/../*. *-
1fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2000: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 42 --. *. * DigestB
2010: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 2d 2d 0a lockModeProc --.
2020: 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 *. *.This funct
2030: 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 ion is invoked b
2040: 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f y the generic IO
2050: 20 6c 65 76 65 6c 0a 20 2a 09 74 6f 20 73 65 74 level. *.to set
2060: 20 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 20 6e 6f blocking and no
2070: 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 2e nblocking modes.
2080: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a . *. * Returns:.
2090: 20 2a 09 30 20 69 66 20 73 75 63 63 65 73 73 66 *.0 if successf
20a0: 75 6c 20 6f 72 20 50 4f 53 49 58 20 65 72 72 6f ul or POSIX erro
20b0: 72 20 63 6f 64 65 20 69 66 20 66 61 69 6c 65 64 r code if failed
20c0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
20d0: 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 74 68 ects:. *.Sets th
20e0: 65 20 64 65 76 69 63 65 20 69 6e 74 6f 20 62 6c e device into bl
20f0: 6f 63 6b 69 6e 67 20 6f 72 20 6e 6f 6e 62 6c 6f ocking or nonblo
2100: 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 2a 09 43 cking mode.. *.C
2110: 61 6e 20 63 61 6c 6c 20 54 63 6c 5f 53 65 74 43 an call Tcl_SetC
2120: 68 61 6e 6e 65 6c 45 72 72 6f 72 2e 0a 20 2a 0a hannelError.. *.
2130: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
2140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2170: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
2180: 20 69 6e 74 20 44 69 67 65 73 74 42 6c 6f 63 6b int DigestBlock
2190: 4d 6f 64 65 50 72 6f 63 28 43 6c 69 65 6e 74 44 ModeProc(ClientD
21a0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
21b0: 69 6e 74 20 6d 6f 64 65 29 20 7b 0a 20 20 20 20 int mode) {.
21c0: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 DigestState *sta
21d0: 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 tePtr = (DigestS
21e0: 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 tate *) clientDa
21f0: 74 61 3b 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 ta;.. if (mod
2200: 65 20 3d 3d 20 54 43 4c 5f 4d 4f 44 45 5f 4e 4f e == TCL_MODE_NO
2210: 4e 42 4c 4f 43 4b 49 4e 47 29 20 7b 0a 09 73 74 NBLOCKING) {..st
2220: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d atePtr->flags |=
2230: 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 3b 0a TLS_TCL_ASYNC;.
2240: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 } else {..st
2250: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d atePtr->flags &=
2260: 20 7e 28 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 ~(TLS_TCL_ASYNC
2270: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 );. }. ret
2280: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d urn 0;.}../*. *-
2290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
22d0: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 43 --. *. * DigestC
22e0: 6c 6f 73 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 loseProc --. *.
22f0: 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 *.This function
2300: 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 is invoked by th
2310: 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 e generic IO lev
2320: 65 6c 20 74 6f 20 70 65 72 66 6f 72 6d 0a 20 2a el to perform. *
2330: 09 63 68 61 6e 6e 65 6c 2d 74 79 70 65 20 73 70 .channel-type sp
2340: 65 63 69 66 69 63 20 63 6c 65 61 6e 75 70 20 77 ecific cleanup w
2350: 68 65 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 hen the channel
2360: 69 73 20 63 6c 6f 73 65 64 2e 20 41 6c 6c 0a 20 is closed. All.
2370: 2a 09 71 75 65 75 65 64 20 6f 75 74 70 75 74 20 *.queued output
2380: 69 73 20 66 6c 75 73 68 65 64 20 70 72 69 6f 72 is flushed prior
2390: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 to calling this
23a0: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a function.. *. *
23b0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 30 20 69 Returns:. *.0 i
23c0: 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 f successful or
23d0: 50 4f 53 49 58 20 65 72 72 6f 72 20 63 6f 64 65 POSIX error code
23e0: 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 if failed.. *.
23f0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
2400: 20 2a 09 44 65 6c 65 74 65 73 20 73 74 6f 72 65 *.Deletes store
2410: 64 20 73 74 61 74 65 20 64 61 74 61 2e 0a 20 2a d state data.. *
2420: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
2430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2460: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 ------. */.int D
2470: 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 28 43 igestCloseProc(C
2480: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
2490: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
24a0: 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 *interp) {.
24b0: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 DigestState *sta
24c0: 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 tePtr = (DigestS
24d0: 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 tate *) clientDa
24e0: 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6e 63 ta;.. /* Canc
24f0: 65 6c 20 61 63 74 69 76 65 20 74 69 6d 65 72 2c el active timer,
2500: 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 20 20 69 if any */. i
2510: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d f (statePtr->tim
2520: 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 er != (Tcl_Timer
2530: 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 Token) NULL) {..
2540: 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 Tcl_DeleteTimerH
2550: 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d andler(statePtr-
2560: 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 >timer);..stateP
2570: 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c tr->timer = (Tcl
2580: 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c _TimerToken) NUL
2590: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a L;. }.. /*
25a0: 20 4f 75 74 70 75 74 20 6d 65 73 73 61 67 65 20 Output message
25b0: 64 69 67 65 73 74 20 69 66 20 6e 6f 74 20 61 6c digest if not al
25c0: 72 65 61 64 79 20 64 6f 6e 65 20 2a 2f 0a 20 20 ready done */.
25d0: 20 20 69 66 20 28 21 28 73 74 61 74 65 50 74 72 if (!(statePtr
25e0: 2d 3e 66 6c 61 67 73 20 26 20 43 48 41 4e 5f 45 ->flags & CHAN_E
25f0: 4f 46 29 29 20 7b 0a 09 54 63 6c 5f 43 68 61 6e OF)) {..Tcl_Chan
2600: 6e 65 6c 20 70 61 72 65 6e 74 20 3d 20 54 63 6c nel parent = Tcl
2610: 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e 6e _GetStackedChann
2620: 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c el(statePtr->sel
2630: 66 29 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 f);..Tcl_Obj *re
2640: 73 75 6c 74 4f 62 6a 3b 0a 09 69 6e 74 20 77 72 sultObj;..int wr
2650: 69 74 74 65 6e 3b 0a 0a 09 69 66 20 28 44 69 67 itten;...if (Dig
2660: 65 73 74 46 69 6e 61 6c 69 7a 65 28 73 74 61 74 estFinalize(stat
2670: 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 73 74 ePtr->interp, st
2680: 61 74 65 50 74 72 2c 20 26 72 65 73 75 6c 74 4f atePtr, &resultO
2690: 62 6a 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b bj) == TCL_OK) {
26a0: 0a 09 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 .. unsigned c
26b0: 68 61 72 20 2a 64 61 74 61 20 3d 20 54 63 6c 5f har *data = Tcl_
26c0: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d GetByteArrayFrom
26d0: 4f 62 6a 28 72 65 73 75 6c 74 4f 62 6a 2c 20 26 Obj(resultObj, &
26e0: 77 72 69 74 74 65 6e 29 3b 0a 09 20 20 20 20 54 written);.. T
26f0: 63 6c 5f 57 72 69 74 65 52 61 77 28 70 61 72 65 cl_WriteRaw(pare
2700: 6e 74 2c 20 64 61 74 61 2c 20 77 72 69 74 74 65 nt, data, writte
2710: 6e 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 n);.. Tcl_Dec
2720: 72 52 65 66 43 6f 75 6e 74 28 72 65 73 75 6c 74 rRefCount(result
2730: 4f 62 6a 29 3b 0a 09 7d 0a 09 73 74 61 74 65 50 Obj);..}..stateP
2740: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 48 41 tr->flags |= CHA
2750: 4e 5f 45 4f 46 3b 0a 20 20 20 20 7d 0a 0a 20 20 N_EOF;. }..
2760: 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20 2a 2f /* Clean-up */
2770: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 . DigestState
2780: 46 72 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a Free(statePtr);.
2790: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a return 0;.}.
27a0: 0a 2f 2a 0a 20 2a 20 53 61 6d 65 20 61 73 20 44 ./*. * Same as D
27b0: 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 20 62 igestCloseProc b
27c0: 75 74 20 77 69 74 68 20 69 6e 64 69 76 69 64 75 ut with individu
27d0: 61 6c 20 72 65 61 64 20 61 6e 64 20 77 72 69 74 al read and writ
27e0: 65 20 63 6c 6f 73 65 20 63 6f 6e 74 72 6f 6c 0a e close control.
27f0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 */.static int D
2800: 69 67 65 73 74 43 6c 6f 73 65 32 50 72 6f 63 28 igestClose2Proc(
2810: 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 74 61 ClientData insta
2820: 6e 63 65 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 nceData, Tcl_Int
2830: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
2840: 20 66 6c 61 67 73 29 20 7b 0a 0a 20 20 20 20 69 flags) {.. i
2850: 66 20 28 28 66 6c 61 67 73 20 26 20 28 54 43 4c f ((flags & (TCL
2860: 5f 43 4c 4f 53 45 5f 52 45 41 44 20 7c 20 54 43 _CLOSE_READ | TC
2870: 4c 5f 43 4c 4f 53 45 5f 57 52 49 54 45 29 29 20 L_CLOSE_WRITE))
2880: 3d 3d 20 30 29 20 7b 0a 09 72 65 74 75 72 6e 20 == 0) {..return
2890: 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 28 DigestCloseProc(
28a0: 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 69 6e instanceData, in
28b0: 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 terp);. }.
28c0: 20 72 65 74 75 72 6e 20 45 49 4e 56 41 4c 3b 0a return EINVAL;.
28d0: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
28e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
2920: 2a 0a 20 2a 20 44 69 67 65 73 74 49 6e 70 75 74 *. * DigestInput
2930: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 Proc --. *. *.Ca
2940: 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 lled by the gene
2950: 72 69 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f ric IO system to
2960: 20 72 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 read data from
2970: 74 72 61 6e 73 66 6f 72 6d 20 61 6e 64 0a 20 2a transform and. *
2980: 09 70 6c 61 63 65 20 69 6e 20 62 75 66 2e 20 54 .place in buf. T
2990: 72 61 6e 73 66 6f 72 6d 20 67 65 74 73 20 64 61 ransform gets da
29a0: 74 61 20 66 72 6f 6d 20 74 68 65 20 75 6e 64 65 ta from the unde
29b0: 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 0a rlying channel..
29c0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 *. * Returns:.
29d0: 2a 09 54 6f 74 61 6c 20 62 79 74 65 73 20 72 65 *.Total bytes re
29e0: 61 64 20 6f 72 20 2d 31 20 66 6f 72 20 61 6e 20 ad or -1 for an
29f0: 65 72 72 6f 72 20 61 6c 6f 6e 67 20 77 69 74 68 error along with
2a00: 20 61 20 50 4f 53 49 58 20 65 72 72 6f 72 0a 20 a POSIX error.
2a10: 2a 09 63 6f 64 65 20 69 6e 20 65 72 72 6f 72 43 *.code in errorC
2a20: 6f 64 65 50 74 72 2e 20 55 73 65 20 45 41 47 41 odePtr. Use EAGA
2a30: 49 4e 20 66 6f 72 20 6e 6f 6e 62 6c 6f 63 6b 69 IN for nonblocki
2a40: 6e 67 20 61 6e 64 20 6e 6f 20 64 61 74 61 2e 0a ng and no data..
2a50: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
2a60: 74 73 3a 0a 20 2a 09 52 65 61 64 20 64 61 74 61 ts:. *.Read data
2a70: 20 66 72 6f 6d 20 74 72 61 6e 73 66 6f 72 6d 20 from transform
2a80: 61 6e 64 20 77 72 69 74 65 20 74 6f 20 62 75 66 and write to buf
2a90: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
2aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
2ae0: 0a 69 6e 74 20 44 69 67 65 73 74 49 6e 70 75 74 .int DigestInput
2af0: 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 Proc(ClientData
2b00: 63 6c 69 65 6e 74 44 61 74 61 2c 20 63 68 61 72 clientData, char
2b10: 20 2a 62 75 66 2c 20 69 6e 74 20 74 6f 52 65 61 *buf, int toRea
2b20: 64 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 d, int *errorCod
2b30: 65 50 74 72 29 20 7b 0a 20 20 20 20 44 69 67 65 ePtr) {. Dige
2b40: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 stState *statePt
2b50: 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 r = (DigestState
2b60: 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a *) clientData;.
2b70: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
2b80: 70 61 72 65 6e 74 3b 0a 20 20 20 20 69 6e 74 20 parent;. int
2b90: 72 65 61 64 3b 0a 20 20 20 20 2a 65 72 72 6f 72 read;. *error
2ba0: 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 CodePtr = 0;..
2bb0: 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 20 6e 6f /* Abort if no
2bc0: 74 68 69 6e 67 20 74 6f 20 70 72 6f 63 65 73 73 thing to process
2bd0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 74 6f 52 65 */. if (toRe
2be0: 61 64 20 3c 3d 20 30 20 7c 7c 20 73 74 61 74 65 ad <= 0 || state
2bf0: 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 Ptr->self == (Tc
2c00: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
2c10: 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 {..return 0;.
2c20: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 }.. /* Get
2c30: 62 79 74 65 73 20 66 72 6f 6d 20 75 6e 64 65 72 bytes from under
2c40: 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 20 2a 2f lying channel */
2c50: 0a 20 20 20 20 70 61 72 65 6e 74 20 3d 20 54 63 . parent = Tc
2c60: 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e l_GetStackedChan
2c70: 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 nel(statePtr->se
2c80: 6c 66 29 3b 0a 20 20 20 20 72 65 61 64 20 3d 20 lf);. read =
2c90: 54 63 6c 5f 52 65 61 64 52 61 77 28 70 61 72 65 Tcl_ReadRaw(pare
2ca0: 6e 74 2c 20 62 75 66 2c 20 74 6f 52 65 61 64 29 nt, buf, toRead)
2cb0: 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 ;.. /* Update
2cc0: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a hash function *
2cd0: 2f 0a 20 20 20 20 69 66 20 28 72 65 61 64 20 3e /. if (read >
2ce0: 20 30 29 20 7b 0a 09 2f 2a 20 48 61 76 65 20 64 0) {../* Have d
2cf0: 61 74 61 20 2a 2f 0a 09 69 66 20 28 21 44 69 67 ata */..if (!Dig
2d00: 65 73 74 55 70 64 61 74 65 28 73 74 61 74 65 50 estUpdate(stateP
2d10: 74 72 2c 20 62 75 66 2c 20 28 73 69 7a 65 5f 74 tr, buf, (size_t
2d20: 29 20 72 65 61 64 2c 20 30 29 29 20 7b 0a 09 20 ) read, 0)) {..
2d30: 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 Tcl_SetChanne
2d40: 6c 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 2d lError(statePtr-
2d50: 3e 73 65 6c 66 2c 20 54 63 6c 5f 4f 62 6a 50 72 >self, Tcl_ObjPr
2d60: 69 6e 74 66 28 22 55 70 64 61 74 65 20 66 61 69 intf("Update fai
2d70: 6c 65 64 3a 20 25 73 22 2c 20 52 45 41 53 4f 4e led: %s", REASON
2d80: 28 29 29 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f ()));.. *erro
2d90: 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4e 56 41 rCodePtr = EINVA
2da0: 4c 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 30 L;.. return 0
2db0: 3b 0a 09 7d 0a 09 2f 2a 20 54 68 69 73 20 69 73 ;..}../* This is
2dc0: 20 63 6f 72 72 65 63 74 20 2a 2f 0a 09 72 65 61 correct */..rea
2dd0: 64 20 3d 20 2d 31 3b 0a 09 2a 65 72 72 6f 72 43 d = -1;..*errorC
2de0: 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 4e 3b odePtr = EAGAIN;
2df0: 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
2e00: 28 72 65 61 64 20 3c 20 30 29 20 7b 0a 09 2f 2a (read < 0) {../*
2e10: 20 45 72 72 6f 72 20 2a 2f 0a 09 2a 65 72 72 6f Error */..*erro
2e20: 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 rCodePtr = Tcl_G
2e30: 65 74 45 72 72 6e 6f 28 29 3b 0a 0a 20 20 20 20 etErrno();..
2e40: 7d 20 65 6c 73 65 20 69 66 20 28 21 28 73 74 61 } else if (!(sta
2e50: 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 43 tePtr->flags & C
2e60: 48 41 4e 5f 45 4f 46 29 29 20 7b 0a 09 2f 2a 20 HAN_EOF)) {../*
2e70: 45 4f 46 20 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 EOF */..Tcl_Obj
2e80: 2a 72 65 73 75 6c 74 4f 62 6a 3b 0a 09 69 66 20 *resultObj;..if
2e90: 28 44 69 67 65 73 74 46 69 6e 61 6c 69 7a 65 28 (DigestFinalize(
2ea0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
2eb0: 2c 20 73 74 61 74 65 50 74 72 2c 20 26 72 65 73 , statePtr, &res
2ec0: 75 6c 74 4f 62 6a 29 20 3d 3d 20 54 43 4c 5f 4f ultObj) == TCL_O
2ed0: 4b 29 20 7b 0a 09 20 20 20 20 75 6e 73 69 67 6e K) {.. unsign
2ee0: 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 ed char *data =
2ef0: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 Tcl_GetByteArray
2f00: 46 72 6f 6d 4f 62 6a 28 72 65 73 75 6c 74 4f 62 FromObj(resultOb
2f10: 6a 2c 20 26 72 65 61 64 29 3b 0a 09 20 20 20 20 j, &read);..
2f20: 6d 65 6d 63 70 79 28 62 75 66 2c 20 64 61 74 61 memcpy(buf, data
2f30: 2c 20 72 65 61 64 29 3b 0a 09 20 20 20 20 54 63 , read);.. Tc
2f40: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 72 l_DecrRefCount(r
2f50: 65 73 75 6c 74 4f 62 6a 29 3b 0a 0a 09 7d 20 65 esultObj);...} e
2f60: 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 lse {.. Tcl_S
2f70: 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72 28 73 etChannelError(s
2f80: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 54 tatePtr->self, T
2f90: 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22 46 69 cl_ObjPrintf("Fi
2fa0: 6e 61 6c 69 7a 65 20 66 61 69 6c 65 64 3a 20 25 nalize failed: %
2fb0: 73 22 2c 20 52 45 41 53 4f 4e 28 29 29 29 3b 0a s", REASON()));.
2fc0: 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 . *errorCodeP
2fd0: 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 20 20 tr = EINVAL;..
2fe0: 20 20 72 65 61 64 20 3d 20 30 3b 0a 09 7d 0a 09 read = 0;..}..
2ff0: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
3000: 7c 3d 20 43 48 41 4e 5f 45 4f 46 3b 0a 20 20 20 |= CHAN_EOF;.
3010: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 }. return re
3020: 61 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d ad;.}../*. *----
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3070: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 4f --. *. * DigestO
3080: 75 74 70 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a utputProc --. *.
3090: 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65 *.Called by the
30a0: 20 67 65 6e 65 72 69 63 20 49 4f 20 73 79 73 74 generic IO syst
30b0: 65 6d 20 74 6f 20 77 72 69 74 65 20 64 61 74 61 em to write data
30c0: 20 69 6e 20 62 75 66 20 74 6f 20 74 72 61 6e 73 in buf to trans
30d0: 66 6f 72 6d 2e 0a 20 2a 09 54 68 65 20 74 72 61 form.. *.The tra
30e0: 6e 73 66 6f 72 6d 20 77 72 69 74 65 73 20 74 68 nsform writes th
30f0: 65 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20 e result to the
3100: 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e underlying chann
3110: 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e el.. *. * Return
3120: 73 3a 0a 20 2a 09 54 6f 74 61 6c 20 62 79 74 65 s:. *.Total byte
3130: 73 20 77 72 69 74 74 65 6e 20 6f 72 20 2d 31 20 s written or -1
3140: 66 6f 72 20 61 6e 20 65 72 72 6f 72 20 61 6c 6f for an error alo
3150: 6e 67 20 77 69 74 68 20 61 20 50 4f 53 49 58 20 ng with a POSIX
3160: 65 72 72 6f 72 0a 20 2a 09 63 6f 64 65 20 69 6e error. *.code in
3170: 20 65 72 72 6f 72 43 6f 64 65 50 74 72 2e 20 55 errorCodePtr. U
3180: 73 65 20 45 41 47 41 49 4e 20 66 6f 72 20 6e 6f se EAGAIN for no
3190: 6e 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 20 63 61 nblocking and ca
31a0: 6e 27 74 20 77 72 69 74 65 20 64 61 74 61 2e 0a n't write data..
31b0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
31c0: 74 73 3a 0a 20 2a 09 47 65 74 20 64 61 74 61 20 ts:. *.Get data
31d0: 66 72 6f 6d 20 62 75 66 20 61 6e 64 20 75 70 64 from buf and upd
31e0: 61 74 65 20 64 69 67 65 73 74 0a 20 2a 0a 20 2a ate digest. *. *
31f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3230: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 20 69 6e 74 20 ------. */. int
3240: 44 69 67 65 73 74 4f 75 74 70 75 74 50 72 6f 63 DigestOutputProc
3250: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
3260: 6e 74 44 61 74 61 2c 20 63 6f 6e 73 74 20 63 68 ntData, const ch
3270: 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 74 6f 57 ar *buf, int toW
3280: 72 69 74 65 2c 20 69 6e 74 20 2a 65 72 72 6f 72 rite, int *error
3290: 43 6f 64 65 50 74 72 29 20 7b 0a 20 20 20 20 44 CodePtr) {. D
32a0: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 igestState *stat
32b0: 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 ePtr = (DigestSt
32c0: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 ate *) clientDat
32d0: 61 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 a;. *errorCod
32e0: 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f ePtr = 0;.. /
32f0: 2a 20 41 62 6f 72 74 20 69 66 20 6e 6f 74 68 69 * Abort if nothi
3300: 6e 67 20 74 6f 20 70 72 6f 63 65 73 73 20 2a 2f ng to process */
3310: 0a 20 20 20 20 69 66 20 28 74 6f 57 72 69 74 65 . if (toWrite
3320: 20 3c 3d 20 30 20 7c 7c 20 73 74 61 74 65 50 74 <= 0 || statePt
3330: 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f r->self == (Tcl_
3340: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
3350: 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 ..return 0;.
3360: 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 }.. /* Update
3370: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a hash function *
3380: 2f 0a 20 20 20 20 69 66 20 28 74 6f 57 72 69 74 /. if (toWrit
3390: 65 20 3e 20 30 20 26 26 20 21 44 69 67 65 73 74 e > 0 && !Digest
33a0: 55 70 64 61 74 65 28 73 74 61 74 65 50 74 72 2c Update(statePtr,
33b0: 20 62 75 66 2c 20 28 73 69 7a 65 5f 74 29 20 74 buf, (size_t) t
33c0: 6f 57 72 69 74 65 2c 20 30 29 29 20 7b 0a 09 54 oWrite, 0)) {..T
33d0: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 cl_SetChannelErr
33e0: 6f 72 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c or(statePtr->sel
33f0: 66 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 f, Tcl_ObjPrintf
3400: 28 22 55 70 64 61 74 65 20 66 61 69 6c 65 64 3a ("Update failed:
3410: 20 25 73 22 2c 20 52 45 41 53 4f 4e 28 29 29 29 %s", REASON()))
3420: 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 ;..*errorCodePtr
3430: 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 72 65 74 75 = EINVAL;..retu
3440: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 rn 0;. }.
3450: 72 65 74 75 72 6e 20 74 6f 57 72 69 74 65 3b 0a return toWrite;.
3460: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
3470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
34a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
34b0: 2a 0a 20 2a 20 44 69 67 65 73 74 53 65 74 4f 70 *. * DigestSetOp
34c0: 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 tionProc --. *.
34d0: 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20 *.Called by the
34e0: 67 65 6e 65 72 69 63 20 49 4f 20 73 79 73 74 65 generic IO syste
34f0: 6d 20 74 6f 20 73 65 74 20 63 68 61 6e 6e 65 6c m to set channel
3500: 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 20 74 6f 20 option name to
3510: 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a 20 52 65 74 value.. *. * Ret
3520: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 urns:. *.TCL_OK
3530: 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 if successful or
3540: 20 54 43 4c 5f 45 52 52 4f 52 20 69 66 20 66 61 TCL_ERROR if fa
3550: 69 6c 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 iled along with
3560: 61 6e 20 65 72 72 6f 72 0a 20 2a 09 6d 65 73 73 an error. *.mess
3570: 61 67 65 20 69 6e 20 69 6e 74 65 72 70 20 61 6e age in interp an
3580: 64 20 54 63 6c 5f 53 65 74 45 72 72 6e 6f 2e 0a d Tcl_SetErrno..
3590: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
35a0: 74 73 3a 0a 20 2a 09 55 70 64 61 74 65 73 20 63 ts:. *.Updates c
35b0: 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 74 6f hannel option to
35c0: 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 new value.. *.
35d0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
35e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3610: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
3620: 69 63 20 69 6e 74 20 44 69 67 65 73 74 53 65 74 ic int DigestSet
3630: 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c 69 65 6e OptionProc(Clien
3640: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
3650: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
3660: 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 terp, const char
3670: 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 0a 09 63 *optionName,..c
3680: 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69 6f onst char *optio
3690: 6e 56 61 6c 75 65 29 20 7b 0a 20 20 20 20 44 69 nValue) {. Di
36a0: 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 gestState *state
36b0: 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 Ptr = (DigestSta
36c0: 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 te *) clientData
36d0: 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 ;. Tcl_Channe
36e0: 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 54 63 l parent;. Tc
36f0: 6c 5f 44 72 69 76 65 72 53 65 74 4f 70 74 69 6f l_DriverSetOptio
3700: 6e 50 72 6f 63 20 2a 73 65 74 4f 70 74 69 6f 6e nProc *setOption
3710: 50 72 6f 63 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 Proc;.. /* Ab
3720: 6f 72 74 20 69 66 20 6e 6f 20 63 68 61 6e 6e 65 ort if no channe
3730: 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 l */. if (sta
3740: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 tePtr->self == (
3750: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
3760: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
3770: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
3780: 20 20 20 2f 2a 20 44 65 6c 65 67 61 74 65 20 6f /* Delegate o
3790: 70 74 69 6f 6e 73 20 64 6f 77 6e 73 74 72 65 61 ptions downstrea
37a0: 6d 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 20 m */. parent
37b0: 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 = Tcl_GetStacked
37c0: 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 Channel(statePtr
37d0: 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 73 65 74 ->self);. set
37e0: 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 54 63 6c OptionProc = Tcl
37f0: 5f 43 68 61 6e 6e 65 6c 53 65 74 4f 70 74 69 6f _ChannelSetOptio
3800: 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 nProc(Tcl_GetCha
3810: 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 6e 74 29 nnelType(parent)
3820: 29 3b 0a 20 20 20 20 69 66 20 28 73 65 74 4f 70 );. if (setOp
3830: 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c 4c tionProc != NULL
3840: 29 20 7b 0a 09 72 65 74 75 72 6e 20 28 2a 73 65 ) {..return (*se
3850: 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28 54 63 6c tOptionProc)(Tcl
3860: 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 _GetChannelInsta
3870: 6e 63 65 44 61 74 61 28 70 61 72 65 6e 74 29 2c nceData(parent),
3880: 20 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e interp, optionN
3890: 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 6c 75 65 ame, optionValue
38a0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
38b0: 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45 49 .Tcl_SetErrno(EI
38c0: 4e 56 41 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NVAL);..return T
38d0: 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c 4f 70 74 cl_BadChannelOpt
38e0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 70 74 69 ion(interp, opti
38f0: 6f 6e 4e 61 6d 65 2c 20 4e 55 4c 4c 29 3b 0a 20 onName, NULL);.
3900: 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d }.}../*. *---
3910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3950: 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 ---. *. * Digest
3960: 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2d 2d GetOptionProc --
3970: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 . *. *.Called by
3980: 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 the generic IO
3990: 73 79 73 74 65 6d 20 74 6f 20 67 65 74 20 63 68 system to get ch
39a0: 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 6e 61 6d annel option nam
39b0: 65 27 73 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a e's value.. *. *
39c0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c Returns:. *.TCL
39d0: 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 _OK if successfu
39e0: 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 69 l or TCL_ERROR i
39f0: 66 20 66 61 69 6c 65 64 20 61 6c 6f 6e 67 20 77 f failed along w
3a00: 69 74 68 20 61 6e 20 65 72 72 6f 72 0a 20 2a 09 ith an error. *.
3a10: 6d 65 73 73 61 67 65 20 69 6e 20 69 6e 74 65 72 message in inter
3a20: 70 20 61 6e 64 20 54 63 6c 5f 53 65 74 45 72 72 p and Tcl_SetErr
3a30: 6e 6f 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 no.. *. * Side e
3a40: 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 ffects:. *.Sets
3a50: 72 65 73 75 6c 74 20 74 6f 20 6f 70 74 69 6f 6e result to option
3a60: 27 73 20 76 61 6c 75 65 0a 20 2a 0a 20 2a 2d 2d 's value. *. *--
3a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ab0: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
3ac0: 69 6e 74 20 44 69 67 65 73 74 47 65 74 4f 70 74 int DigestGetOpt
3ad0: 69 6f 6e 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 ionProc(ClientDa
3ae0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
3af0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
3b00: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f p, const char *o
3b10: 70 74 69 6f 6e 4e 61 6d 65 2c 0a 09 54 63 6c 5f ptionName,..Tcl_
3b20: 44 53 74 72 69 6e 67 20 2a 6f 70 74 69 6f 6e 56 DString *optionV
3b30: 61 6c 75 65 29 20 7b 0a 20 20 20 20 44 69 67 65 alue) {. Dige
3b40: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 stState *statePt
3b50: 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 r = (DigestState
3b60: 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a *) clientData;.
3b70: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
3b80: 70 61 72 65 6e 74 3b 0a 20 20 20 20 54 63 6c 5f parent;. Tcl_
3b90: 44 72 69 76 65 72 47 65 74 4f 70 74 69 6f 6e 50 DriverGetOptionP
3ba0: 72 6f 63 20 2a 67 65 74 4f 70 74 69 6f 6e 50 72 roc *getOptionPr
3bb0: 6f 63 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 oc;.. /* Abor
3bc0: 74 20 69 66 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 t if no channel
3bd0: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 */. if (state
3be0: 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 Ptr->self == (Tc
3bf0: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
3c00: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
3c10: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
3c20: 20 2f 2a 20 44 65 6c 65 67 61 74 65 20 6f 70 74 /* Delegate opt
3c30: 69 6f 6e 73 20 64 6f 77 6e 73 74 72 65 61 6d 20 ions downstream
3c40: 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 20 3d 20 */. parent =
3c50: 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68 Tcl_GetStackedCh
3c60: 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e annel(statePtr->
3c70: 73 65 6c 66 29 3b 0a 20 20 20 20 67 65 74 4f 70 self);. getOp
3c80: 74 69 6f 6e 50 72 6f 63 20 3d 20 54 63 6c 5f 43 tionProc = Tcl_C
3c90: 68 61 6e 6e 65 6c 47 65 74 4f 70 74 69 6f 6e 50 hannelGetOptionP
3ca0: 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e roc(Tcl_GetChann
3cb0: 65 6c 54 79 70 65 28 70 61 72 65 6e 74 29 29 3b elType(parent));
3cc0: 0a 20 20 20 20 69 66 20 28 67 65 74 4f 70 74 69 . if (getOpti
3cd0: 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c 4c 29 20 onProc != NULL)
3ce0: 7b 0a 09 72 65 74 75 72 6e 20 28 2a 67 65 74 4f {..return (*getO
3cf0: 70 74 69 6f 6e 50 72 6f 63 29 28 54 63 6c 5f 47 ptionProc)(Tcl_G
3d00: 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 etChannelInstanc
3d10: 65 44 61 74 61 28 70 61 72 65 6e 74 29 2c 20 69 eData(parent), i
3d20: 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d nterp, optionNam
3d30: 65 2c 20 6f 70 74 69 6f 6e 56 61 6c 75 65 29 3b e, optionValue);
3d40: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
3d50: 6f 70 74 69 6f 6e 4e 61 6d 65 20 3d 3d 20 28 63 optionName == (c
3d60: 68 61 72 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f har*) NULL) {../
3d70: 2a 20 52 65 71 75 65 73 74 20 69 73 20 71 75 65 * Request is que
3d80: 72 79 20 66 6f 72 20 61 6c 6c 20 6f 70 74 69 6f ry for all optio
3d90: 6e 73 2c 20 74 68 69 73 20 69 73 20 6f 6b 2e 20 ns, this is ok.
3da0: 2a 2f 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f */..return TCL_O
3db0: 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a K;. } else {.
3dc0: 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45 49 .Tcl_SetErrno(EI
3dd0: 4e 56 41 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NVAL);..return T
3de0: 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c 4f 70 74 cl_BadChannelOpt
3df0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 70 74 69 ion(interp, opti
3e00: 6f 6e 4e 61 6d 65 2c 20 4e 55 4c 4c 29 3b 0a 20 onName, NULL);.
3e10: 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d }.}../*. *---
3e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e60: 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 ---. *. * Digest
3e70: 54 69 6d 65 72 48 61 6e 64 6c 65 72 20 2d 2d 0a TimerHandler --.
3e80: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 *. *.Called by
3e90: 74 68 65 20 6e 6f 74 69 66 69 65 72 20 76 69 61 the notifier via
3ea0: 20 74 69 6d 65 72 20 74 6f 20 66 6c 75 73 68 20 timer to flush
3eb0: 6f 75 74 20 70 65 6e 64 69 6e 67 20 69 6e 70 75 out pending inpu
3ec0: 74 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 20 52 65 t data.. *. * Re
3ed0: 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74 68 69 6e turns:. *.Nothin
3ee0: 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 g. *. * Side eff
3ef0: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 63 61 6c ects:. *.May cal
3f00: 6c 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e l Tcl_NotifyChan
3f10: 6e 65 6c 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d nel. *. *-------
3f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
3f60: 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 */.static void
3f70: 44 69 67 65 73 74 54 69 6d 65 72 48 61 6e 64 6c DigestTimerHandl
3f80: 65 72 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c er(ClientData cl
3f90: 69 65 6e 74 44 61 74 61 29 20 7b 0a 20 20 20 20 ientData) {.
3fa0: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 DigestState *sta
3fb0: 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 tePtr = (DigestS
3fc0: 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 tate *) clientDa
3fd0: 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 ta;.. /* Abor
3fe0: 74 20 69 66 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 t if no channel
3ff0: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 */. if (state
4000: 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 Ptr->self == (Tc
4010: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
4020: 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 {..return;.
4030: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 72 20 }.. /* Clear
4040: 74 69 6d 65 72 20 74 6f 6b 65 6e 20 2a 2f 0a 20 timer token */.
4050: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 74 69 6d statePtr->tim
4060: 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 er = (Tcl_TimerT
4070: 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 0a 20 20 20 oken) NULL;..
4080: 20 2f 2a 20 46 69 72 65 20 65 76 65 6e 74 20 69 /* Fire event i
4090: 66 20 74 68 65 72 65 20 69 73 20 70 65 6e 64 69 f there is pendi
40a0: 6e 67 20 64 61 74 61 2c 20 73 6b 69 70 20 6f 74 ng data, skip ot
40b0: 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 20 20 69 herwise */. i
40c0: 66 20 28 28 73 74 61 74 65 50 74 72 2d 3e 77 61 f ((statePtr->wa
40d0: 74 63 68 4d 61 73 6b 20 26 20 54 43 4c 5f 52 45 tchMask & TCL_RE
40e0: 41 44 41 42 4c 45 29 20 26 26 20 28 54 63 6c 5f ADABLE) && (Tcl_
40f0: 49 6e 70 75 74 42 75 66 66 65 72 65 64 28 73 74 InputBuffered(st
4100: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 20 3e 20 atePtr->self) >
4110: 30 29 29 20 7b 0a 09 54 63 6c 5f 4e 6f 74 69 66 0)) {..Tcl_Notif
4120: 79 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 yChannel(statePt
4130: 72 2d 3e 73 65 6c 66 2c 20 54 43 4c 5f 52 45 41 r->self, TCL_REA
4140: 44 41 42 4c 45 29 3b 0a 20 20 20 20 7d 0a 7d 0a DABLE);. }.}.
4150: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
4160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
41a0: 20 2a 20 44 69 67 65 73 74 57 61 74 63 68 50 72 * DigestWatchPr
41b0: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 49 6e 69 74 oc --. *. *.Init
41c0: 69 61 6c 69 7a 65 20 74 68 65 20 6e 6f 74 69 66 ialize the notif
41d0: 69 65 72 20 74 6f 20 77 61 74 63 68 20 66 6f 72 ier to watch for
41e0: 20 65 76 65 6e 74 73 20 66 72 6f 6d 20 74 68 69 events from thi
41f0: 73 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a s channel.. *. *
4200: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74 Returns:. *.Not
4210: 68 69 6e 67 20 28 63 61 6e 27 74 20 72 65 74 75 hing (can't retu
4220: 72 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 rn error message
4230: 73 29 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 s). *. * Side ef
4240: 66 65 63 74 73 3a 0a 20 2a 09 43 6f 6e 66 69 67 fects:. *.Config
4250: 75 72 65 20 6e 6f 74 69 66 69 65 72 20 73 6f 20 ure notifier so
4260: 66 75 74 75 72 65 20 65 76 65 6e 74 73 20 6f 6e future events on
4270: 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 69 6c the channel wil
4280: 6c 20 62 65 20 73 65 65 6e 20 62 79 20 54 63 6c l be seen by Tcl
4290: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
42a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
42d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
42e0: 2f 0a 76 6f 69 64 20 44 69 67 65 73 74 57 61 74 /.void DigestWat
42f0: 63 68 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 chProc(ClientDat
4300: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e a clientData, in
4310: 74 20 6d 61 73 6b 29 20 7b 0a 20 20 20 20 44 69 t mask) {. Di
4320: 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 gestState *state
4330: 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 Ptr = (DigestSta
4340: 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 te *) clientData
4350: 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 ;. Tcl_Channe
4360: 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 54 63 l parent;. Tc
4370: 6c 5f 44 72 69 76 65 72 57 61 74 63 68 50 72 6f l_DriverWatchPro
4380: 63 20 2a 77 61 74 63 68 50 72 6f 63 3b 0a 0a 20 c *watchProc;..
4390: 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 20 6e /* Abort if n
43a0: 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 o channel */.
43b0: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 if (statePtr->s
43c0: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e elf == (Tcl_Chan
43d0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
43e0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 turn;. }..
43f0: 20 2f 2a 20 53 74 6f 72 65 20 4f 52 2d 65 64 20 /* Store OR-ed
4400: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54 combination of T
4410: 43 4c 5f 52 45 41 44 41 42 4c 45 2c 20 54 43 4c CL_READABLE, TCL
4420: 5f 57 52 49 54 41 42 4c 45 20 61 6e 64 20 54 43 _WRITABLE and TC
4430: 4c 5f 45 58 43 45 50 54 49 4f 4e 20 2a 2f 0a 20 L_EXCEPTION */.
4440: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 77 61 74 statePtr->wat
4450: 63 68 4d 61 73 6b 20 3d 20 6d 61 73 6b 3b 0a 0a chMask = mask;..
4460: 20 20 20 20 2f 2a 20 50 72 6f 70 61 67 61 74 65 /* Propagate
4470: 20 6d 61 73 6b 20 69 6e 66 6f 20 74 6f 20 70 61 mask info to pa
4480: 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a rent channel */.
4490: 20 20 20 20 70 61 72 65 6e 74 20 3d 20 54 63 6c parent = Tcl
44a0: 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e 6e _GetStackedChann
44b0: 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c el(statePtr->sel
44c0: 66 29 3b 0a 20 20 20 20 77 61 74 63 68 50 72 6f f);. watchPro
44d0: 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 57 c = Tcl_ChannelW
44e0: 61 74 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74 atchProc(Tcl_Get
44f0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 ChannelType(pare
4500: 6e 74 29 29 3b 0a 20 20 20 20 77 61 74 63 68 50 nt));. watchP
4510: 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e roc(Tcl_GetChann
4520: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 70 elInstanceData(p
4530: 61 72 65 6e 74 29 2c 20 6d 61 73 6b 29 3b 0a 0a arent), mask);..
4540: 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 70 65 /* Remove pe
4550: 6e 64 69 6e 67 20 74 69 6d 65 72 20 2a 2f 0a 20 nding timer */.
4560: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
4570: 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 >timer != (Tcl_T
4580: 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 imerToken) NULL)
4590: 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 {..Tcl_DeleteTi
45a0: 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 merHandler(state
45b0: 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 Ptr->timer);..st
45c0: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 atePtr->timer =
45d0: 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 (Tcl_TimerToken)
45e0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 NULL;. }..
45f0: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 /* If there is
4600: 20 64 61 74 61 20 70 65 6e 64 69 6e 67 2c 20 73 data pending, s
4610: 65 74 20 6e 65 77 20 74 69 6d 65 72 20 74 6f 20 et new timer to
4620: 63 61 6c 6c 20 54 63 6c 5f 4e 6f 74 69 66 79 43 call Tcl_NotifyC
4630: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 hannel */. if
4640: 20 28 28 6d 61 73 6b 20 26 20 54 43 4c 5f 52 45 ((mask & TCL_RE
4650: 41 44 41 42 4c 45 29 20 26 26 20 28 54 63 6c 5f ADABLE) && (Tcl_
4660: 49 6e 70 75 74 42 75 66 66 65 72 65 64 28 73 74 InputBuffered(st
4670: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 20 3e 20 atePtr->self) >
4680: 30 29 29 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 0)) {..statePtr-
4690: 3e 74 69 6d 65 72 20 3d 20 54 63 6c 5f 43 72 65 >timer = Tcl_Cre
46a0: 61 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 ateTimerHandler(
46b0: 52 45 41 44 5f 44 45 4c 41 59 2c 20 44 69 67 65 READ_DELAY, Dige
46c0: 73 74 54 69 6d 65 72 48 61 6e 64 6c 65 72 2c 20 stTimerHandler,
46d0: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 (ClientData) sta
46e0: 74 65 50 74 72 29 3b 0a 20 20 20 20 7d 0a 7d 0a tePtr);. }.}.
46f0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
4700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
4740: 20 2a 20 44 69 67 65 73 74 47 65 74 48 61 6e 64 * DigestGetHand
4750: 6c 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 leProc --. *. *.
4760: 43 61 6c 6c 65 64 20 66 72 6f 6d 20 54 63 6c 5f Called from Tcl_
4770: 47 65 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 GetChannelHandle
4780: 20 74 6f 20 72 65 74 72 69 65 76 65 20 4f 53 20 to retrieve OS
4790: 73 70 65 63 69 66 69 63 20 66 69 6c 65 20 68 61 specific file ha
47a0: 6e 64 6c 65 0a 20 2a 09 66 72 6f 6d 20 69 6e 73 ndle. *.from ins
47b0: 69 64 65 20 74 68 69 73 20 63 68 61 6e 6e 65 6c ide this channel
47c0: 2e 20 4e 6f 74 20 75 73 65 64 20 66 6f 72 20 74 . Not used for t
47d0: 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 3f 0a ransformations?.
47e0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 *. * Returns:.
47f0: 2a 09 54 43 4c 5f 4f 4b 20 66 6f 72 20 73 75 63 *.TCL_OK for suc
4800: 63 65 73 73 20 6f 72 20 54 43 4c 5f 45 52 52 4f cess or TCL_ERRO
4810: 52 20 66 6f 72 20 65 72 72 6f 72 20 6f 72 20 69 R for error or i
4820: 66 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 2e f not supported.
4830: 20 49 66 0a 20 2a 09 64 69 72 65 63 74 69 6f 6e If. *.direction
4840: 20 69 73 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 is TCL_READABLE
4850: 2c 20 73 65 74 73 20 68 61 6e 64 6c 65 50 74 72 , sets handlePtr
4860: 20 74 6f 20 74 68 65 20 68 61 6e 64 6c 65 20 75 to the handle u
4870: 73 65 64 20 66 6f 72 0a 20 2a 09 69 6e 70 75 74 sed for. *.input
4880: 2c 20 6f 72 20 69 66 20 54 43 4c 5f 57 52 49 54 , or if TCL_WRIT
4890: 41 42 4c 45 20 73 65 74 73 20 74 6f 20 74 68 65 ABLE sets to the
48a0: 20 68 61 6e 64 6c 65 20 75 73 65 64 20 66 6f 72 handle used for
48b0: 20 6f 75 74 70 75 74 2e 0a 20 2a 0a 20 2a 20 53 output.. *. * S
48c0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
48d0: 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d None. *. *------
48e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4920: 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 47 . */.int DigestG
4930: 65 74 48 61 6e 64 6c 65 50 72 6f 63 28 43 6c 69 etHandleProc(Cli
4940: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
4950: 74 61 2c 20 69 6e 74 20 64 69 72 65 63 74 69 6f ta, int directio
4960: 6e 2c 20 43 6c 69 65 6e 74 44 61 74 61 20 2a 68 n, ClientData *h
4970: 61 6e 64 6c 65 50 74 72 29 20 7b 0a 20 20 20 20 andlePtr) {.
4980: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 DigestState *sta
4990: 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 tePtr = (DigestS
49a0: 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 tate *) clientDa
49b0: 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e ta;. Tcl_Chan
49c0: 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 0a 20 20 20 nel parent;..
49d0: 20 2f 2a 20 41 62 6f 72 74 20 69 66 20 6e 6f 20 /* Abort if no
49e0: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 channel */. i
49f0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c f (statePtr->sel
4a00: 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 f == (Tcl_Channe
4a10: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
4a20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
4a30: 20 20 7d 0a 0a 20 20 20 20 70 61 72 65 6e 74 20 }.. parent
4a40: 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 = Tcl_GetStacked
4a50: 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 Channel(statePtr
4a60: 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 72 65 74 ->self);. ret
4a70: 75 72 6e 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e urn Tcl_GetChann
4a80: 65 6c 48 61 6e 64 6c 65 28 70 61 72 65 6e 74 2c elHandle(parent,
4a90: 20 64 69 72 65 63 74 69 6f 6e 2c 20 68 61 6e 64 direction, hand
4aa0: 6c 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a lePtr);.}../*. *
4ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4af0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 ------. *. * Dig
4b00: 65 73 74 4e 6f 74 69 66 79 50 72 6f 63 20 2d 2d estNotifyProc --
4b10: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 . *. *.Called by
4b20: 20 54 63 6c 20 74 6f 20 69 6e 66 6f 72 6d 20 75 Tcl to inform u
4b30: 73 20 6f 66 20 61 63 74 69 76 69 74 79 20 6f 6e s of activity on
4b40: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 the underlying
4b50: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 channel.. *. * R
4b60: 65 74 75 72 6e 73 3a 0a 20 2a 09 55 6e 63 68 61 eturns:. *.Uncha
4b70: 6e 67 65 64 20 69 6e 74 65 72 65 73 74 4d 61 73 nged interestMas
4b80: 6b 20 77 68 69 63 68 20 69 73 20 61 6e 20 4f 52 k which is an OR
4b90: 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 -ed combination
4ba0: 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 of TCL_READABLE
4bb0: 6f 72 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 0a or TCL_WRITABLE.
4bc0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
4bd0: 74 73 3a 0a 20 2a 09 43 61 6e 63 65 6c 73 20 61 ts:. *.Cancels a
4be0: 6e 79 20 70 65 6e 64 69 6e 67 20 74 69 6d 65 72 ny pending timer
4bf0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d .. *. *---------
4c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
4c40: 2f 0a 69 6e 74 20 44 69 67 65 73 74 4e 6f 74 69 /.int DigestNoti
4c50: 66 79 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 fyProc(ClientDat
4c60: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e a clientData, in
4c70: 74 20 69 6e 74 65 72 65 73 74 4d 61 73 6b 29 20 t interestMask)
4c80: 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 {. DigestStat
4c90: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 e *statePtr = (D
4ca0: 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c igestState *) cl
4cb0: 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 2f ientData;.. /
4cc0: 2a 20 53 6b 69 70 20 74 69 6d 65 72 20 65 76 65 * Skip timer eve
4cd0: 6e 74 20 61 73 20 72 65 64 75 6e 64 61 6e 74 20 nt as redundant
4ce0: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 */. if (state
4cf0: 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 Ptr->timer != (T
4d00: 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e cl_TimerToken) N
4d10: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 ULL) {..Tcl_Dele
4d20: 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 teTimerHandler(s
4d30: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b tatePtr->timer);
4d40: 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 ..statePtr->time
4d50: 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f r = (Tcl_TimerTo
4d60: 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d ken) NULL;. }
4d70: 0a 20 20 20 20 72 65 74 75 72 6e 20 69 6e 74 65 . return inte
4d80: 72 65 73 74 4d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a restMask;.}../*.
4d90: 20 2a 0a 20 2a 20 43 68 61 6e 6e 65 6c 20 74 79 *. * Channel ty
4da0: 70 65 20 73 74 72 75 63 74 75 72 65 20 64 65 66 pe structure def
4db0: 69 6e 69 74 69 6f 6e 20 66 6f 72 20 64 69 67 65 inition for dige
4dc0: 73 74 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f st transformatio
4dd0: 6e 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 ns.. *. */.stati
4de0: 63 20 63 6f 6e 73 74 20 54 63 6c 5f 43 68 61 6e c const Tcl_Chan
4df0: 6e 65 6c 54 79 70 65 20 64 69 67 65 73 74 43 68 nelType digestCh
4e00: 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a 20 20 annelType = {.
4e10: 20 20 22 64 69 67 65 73 74 22 2c 09 09 09 2f 2a "digest",.../*
4e20: 20 54 79 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 Type name */.
4e30: 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 TCL_CHANNEL_VE
4e40: 52 53 49 4f 4e 5f 35 2c 09 2f 2a 20 76 35 20 63 RSION_5,./* v5 c
4e50: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 44 69 hannel */. Di
4e60: 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 2c 09 09 gestCloseProc,..
4e70: 2f 2a 20 43 6c 6f 73 65 20 70 72 6f 63 20 2a 2f /* Close proc */
4e80: 0a 20 20 20 20 44 69 67 65 73 74 49 6e 70 75 74 . DigestInput
4e90: 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 70 75 74 20 Proc,../* Input
4ea0: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 proc */. Dige
4eb0: 73 74 4f 75 74 70 75 74 50 72 6f 63 2c 09 09 2f stOutputProc,../
4ec0: 2a 20 4f 75 74 70 75 74 20 70 72 6f 63 20 2a 2f * Output proc */
4ed0: 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 . NULL,.../*
4ee0: 53 65 65 6b 20 70 72 6f 63 20 2a 2f 0a 20 20 20 Seek proc */.
4ef0: 20 44 69 67 65 73 74 53 65 74 4f 70 74 69 6f 6e DigestSetOption
4f00: 50 72 6f 63 2c 09 2f 2a 20 53 65 74 20 6f 70 74 Proc,./* Set opt
4f10: 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 ion proc */.
4f20: 44 69 67 65 73 74 47 65 74 4f 70 74 69 6f 6e 50 DigestGetOptionP
4f30: 72 6f 63 2c 09 2f 2a 20 47 65 74 20 6f 70 74 69 roc,./* Get opti
4f40: 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 on proc */. D
4f50: 69 67 65 73 74 57 61 74 63 68 50 72 6f 63 2c 09 igestWatchProc,.
4f60: 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 6e ./* Initialize n
4f70: 6f 74 69 66 69 65 72 20 2a 2f 0a 20 20 20 20 44 otifier */. D
4f80: 69 67 65 73 74 47 65 74 48 61 6e 64 6c 65 50 72 igestGetHandlePr
4f90: 6f 63 2c 09 2f 2a 20 47 65 74 20 4f 53 20 68 61 oc,./* Get OS ha
4fa0: 6e 64 6c 65 73 20 6f 75 74 20 6f 66 20 63 68 61 ndles out of cha
4fb0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 44 69 67 65 nnel */. Dige
4fc0: 73 74 43 6c 6f 73 65 32 50 72 6f 63 2c 09 09 2f stClose2Proc,../
4fd0: 2a 20 63 6c 6f 73 65 32 70 72 6f 63 20 2a 2f 0a * close2proc */.
4fe0: 20 20 20 20 44 69 67 65 73 74 42 6c 6f 63 6b 4d DigestBlockM
4ff0: 6f 64 65 50 72 6f 63 2c 09 2f 2a 20 53 65 74 20 odeProc,./* Set
5000: 62 6c 6f 63 6b 69 6e 67 2f 6e 6f 6e 62 6c 6f 63 blocking/nonbloc
5010: 6b 69 6e 67 20 6d 6f 64 65 2a 2f 0a 20 20 20 20 king mode*/.
5020: 4e 55 4c 4c 2c 09 09 09 2f 2a 20 46 6c 75 73 68 NULL,.../* Flush
5030: 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 proc */. Dig
5040: 65 73 74 4e 6f 74 69 66 79 50 72 6f 63 2c 09 09 estNotifyProc,..
5050: 2f 2a 20 48 61 6e 64 6c 69 6e 67 20 6f 66 20 65 /* Handling of e
5060: 76 65 6e 74 73 20 62 75 62 62 6c 69 6e 67 20 75 vents bubbling u
5070: 70 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 p */. NULL,..
5080: 09 2f 2a 20 57 69 64 65 20 73 65 65 6b 20 70 72 ./* Wide seek pr
5090: 6f 63 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 oc */. NULL,.
50a0: 09 09 2f 2a 20 54 68 72 65 61 64 20 61 63 74 69 ../* Thread acti
50b0: 6f 6e 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 09 09 on */. NULL..
50c0: 09 2f 2a 20 54 72 75 6e 63 61 74 65 20 2a 2f 0a ./* Truncate */.
50d0: 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d };../*. *-------
50e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
50f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
5120: 20 2a 0a 20 2a 20 44 69 67 65 73 74 43 68 61 6e *. * DigestChan
5130: 6e 65 6c 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a nelHandler --. *
5140: 0a 20 2a 09 43 72 65 61 74 65 20 61 20 73 74 61 . *.Create a sta
5150: 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20 66 6f 72 cked channel for
5160: 20 61 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 a message diges
5170: 74 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e t transformation
5180: 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a .. *. * Returns:
5190: 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 . *.TCL_OK or TC
51a0: 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 L_ERROR. *. * Si
51b0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 41 de effects:. *.A
51c0: 64 64 73 20 74 72 61 6e 73 66 6f 72 6d 20 74 6f dds transform to
51d0: 20 63 68 61 6e 6e 65 6c 20 61 6e 64 20 73 65 74 channel and set
51e0: 73 20 72 65 73 75 6c 74 20 74 6f 20 63 68 61 6e s result to chan
51f0: 6e 65 6c 20 69 64 20 6f 72 20 65 72 72 6f 72 20 nel id or error
5200: 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 2d 2d message.. *. *--
5210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5250: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
5260: 69 6e 74 0a 44 69 67 65 73 74 43 68 61 6e 6e 65 int.DigestChanne
5270: 6c 48 61 6e 64 6c 65 72 28 54 63 6c 5f 49 6e 74 lHandler(Tcl_Int
5280: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e erp *interp, con
5290: 73 74 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c st char *channel
52a0: 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a , const EVP_MD *
52b0: 6d 64 2c 0a 09 63 6f 6e 73 74 20 45 56 50 5f 43 md,..const EVP_C
52c0: 49 50 48 45 52 20 2a 63 69 70 68 65 72 2c 20 69 IPHER *cipher, i
52d0: 6e 74 20 66 6f 72 6d 61 74 2c 20 54 63 6c 5f 4f nt format, Tcl_O
52e0: 62 6a 20 2a 6b 65 79 4f 62 6a 2c 20 45 56 50 5f bj *keyObj, EVP_
52f0: 4d 41 43 20 2a 6d 61 63 29 20 7b 0a 20 20 20 20 MAC *mac) {.
5300: 69 6e 74 20 6d 6f 64 65 3b 20 2f 2a 20 4f 52 2d int mode; /* OR-
5310: 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f ed combination o
5320: 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 61 f TCL_READABLE a
5330: 6e 64 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 nd TCL_WRITABLE
5340: 2a 2f 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e */. Tcl_Chann
5350: 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 44 69 67 el chan;. Dig
5360: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 estState *stateP
5370: 74 72 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 tr;.. /* Vali
5380: 64 61 74 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 date args */.
5390: 20 69 66 20 28 63 68 61 6e 6e 65 6c 20 3d 3d 20 if (channel ==
53a0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 4e (const char *) N
53b0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
53c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
53d0: 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68 61 6e . /* Get chan
53e0: 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20 20 63 68 nel Id */. ch
53f0: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e an = Tcl_GetChan
5400: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e nel(interp, chan
5410: 6e 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 nel, &mode);.
5420: 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 if (chan == (Tc
5430: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
5440: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
5450: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
5460: 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f /* Make sure to
5470: 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 operate on the
5480: 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 topmost channel
5490: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 */. chan = Tc
54a0: 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 l_GetTopChannel(
54b0: 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 chan);.. /* C
54c0: 72 65 61 74 65 20 73 74 61 74 65 20 64 61 74 61 reate state data
54d0: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 structure */.
54e0: 20 20 69 66 20 28 28 73 74 61 74 65 50 74 72 20 if ((statePtr
54f0: 3d 20 44 69 67 65 73 74 53 74 61 74 65 4e 65 77 = DigestStateNew
5500: 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74 29 (interp, format)
5510: 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 ) == NULL) {..Tc
5520: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
5530: 6e 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20 61 nterp, "Memory a
5540: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 22 llocation error"
5550: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
5560: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
5570: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 ROR;. }. s
5580: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 tatePtr->self =
5590: 63 68 61 6e 3b 0a 20 20 20 20 73 74 61 74 65 50 chan;. stateP
55a0: 74 72 2d 3e 6d 6f 64 65 20 3d 20 6d 6f 64 65 3b tr->mode = mode;
55b0: 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c .. /* Initial
55c0: 69 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f ize hash functio
55d0: 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 44 69 67 n */. if (Dig
55e0: 65 73 74 49 6e 69 74 69 61 6c 69 7a 65 28 69 6e estInitialize(in
55f0: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 terp, statePtr,
5600: 6d 64 2c 20 63 69 70 68 65 72 2c 20 6b 65 79 4f md, cipher, keyO
5610: 62 6a 2c 20 6d 61 63 29 20 21 3d 20 54 43 4c 5f bj, mac) != TCL_
5620: 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 OK) {..return TC
5630: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
5640: 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 /* Configure
5650: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
5660: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
5670: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
5680: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e n, "-translation
5690: 22 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 ", "binary");.
56a0: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 if (Tcl_GetCha
56b0: 6e 6e 65 6c 42 75 66 66 65 72 53 69 7a 65 28 63 nnelBufferSize(c
56c0: 68 61 6e 29 20 3c 20 45 56 50 5f 4d 41 58 5f 4d han) < EVP_MAX_M
56d0: 44 5f 53 49 5a 45 20 2a 20 32 29 20 7b 0a 09 54 D_SIZE * 2) {..T
56e0: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 42 75 66 cl_SetChannelBuf
56f0: 66 65 72 53 69 7a 65 28 63 68 61 6e 2c 20 45 56 ferSize(chan, EV
5700: 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 20 2a 20 P_MAX_MD_SIZE *
5710: 32 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2);. }.. /
5720: 2a 20 53 74 61 63 6b 20 63 68 61 6e 6e 65 6c 2c * Stack channel,
5730: 20 61 62 6f 72 74 20 66 6f 72 20 65 72 72 6f 72 abort for error
5740: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 */. statePtr
5750: 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f 53 74 61 ->self = Tcl_Sta
5760: 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 ckChannel(interp
5770: 2c 20 26 64 69 67 65 73 74 43 68 61 6e 6e 65 6c , &digestChannel
5780: 54 79 70 65 2c 20 28 43 6c 69 65 6e 74 44 61 74 Type, (ClientDat
5790: 61 29 20 73 74 61 74 65 50 74 72 2c 20 6d 6f 64 a) statePtr, mod
57a0: 65 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 69 66 e, chan);. if
57b0: 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 (statePtr->self
57c0: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
57d0: 29 20 4e 55 4c 4c 29 20 7b 0a 09 44 69 67 65 73 ) NULL) {..Diges
57e0: 74 53 74 61 74 65 46 72 65 65 28 73 74 61 74 65 tStateFree(state
57f0: 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 Ptr);..return TC
5800: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
5810: 20 20 20 20 2f 2a 20 53 65 74 20 72 65 73 75 6c /* Set resul
5820: 74 20 74 6f 20 63 68 61 6e 6e 65 6c 20 49 64 20 t to channel Id
5830: 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 */. Tcl_SetRe
5840: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 sult(interp, (ch
5850: 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 43 68 61 ar *) Tcl_GetCha
5860: 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 20 nnelName(chan),
5870: 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 TCL_VOLATILE);.
5880: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
5890: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ;.}../*. *------
58a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
58b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
58c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
58d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
58e0: 0a 20 2a 0a 20 2a 20 55 6e 73 74 61 63 6b 20 43 . *. * Unstack C
58f0: 68 61 6e 6e 65 6c 20 2d 2d 0a 20 2a 0a 20 2a 09 hannel --. *. *.
5900: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 This function re
5910: 6d 6f 76 65 73 20 74 68 65 20 73 74 61 63 6b 65 moves the stacke
5920: 64 20 63 68 61 6e 6e 65 6c 20 66 72 6f 6d 20 74 d channel from t
5930: 68 65 20 74 6f 70 20 6f 66 20 74 68 65 0a 20 2a he top of the. *
5940: 09 63 68 61 6e 6e 65 6c 20 73 74 61 63 6b 20 69 .channel stack i
5950: 66 20 69 74 20 69 73 20 61 20 64 69 67 65 73 74 f it is a digest
5960: 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 channel.. *. *
5970: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f Returns:. *.TCL_
5980: 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a OK or TCL_ERROR.
5990: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
59a0: 74 73 3a 0a 20 2a 09 52 65 6d 6f 76 65 73 20 74 ts:. *.Removes t
59b0: 72 61 6e 73 66 6f 72 6d 20 66 72 6f 6d 20 63 68 ransform from ch
59c0: 61 6e 6e 65 6c 20 6f 72 20 73 65 74 73 20 72 65 annel or sets re
59d0: 73 75 6c 74 20 74 6f 20 65 72 72 6f 72 20 6d 65 sult to error me
59e0: 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d ssage.. *. *----
59f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5a30: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
5a40: 74 0a 44 69 67 65 73 74 55 6e 73 74 61 63 6b 4f t.DigestUnstackO
5a50: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
5a60: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
5a70: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
5a80: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
5a90: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
5aa0: 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e ) {. Tcl_Chan
5ab0: 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 69 6e nel chan;. in
5ac0: 74 20 6d 6f 64 65 3b 20 2f 2a 20 4f 52 2d 65 64 t mode; /* OR-ed
5ad0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 combination of
5ae0: 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 61 6e 64 TCL_READABLE and
5af0: 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 20 2a TCL_WRITABLE *
5b00: 2f 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 /.. /* Valida
5b10: 74 65 20 61 72 67 20 63 6f 75 6e 74 20 2a 2f 0a te arg count */.
5b20: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 if (objc !=
5b30: 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 2) {..Tcl_WrongN
5b40: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
5b50: 2c 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c , objv, "channel
5b60: 49 64 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 Id");..return TC
5b70: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
5b80: 20 20 20 20 2f 2a 20 47 65 74 20 63 68 61 6e 6e /* Get chann
5b90: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d el */. chan =
5ba0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 Tcl_GetChannel(
5bb0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 interp, Tcl_GetS
5bc0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a tringFromObj(obj
5bd0: 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 26 6d 6f v[1], NULL), &mo
5be0: 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 de);. if (cha
5bf0: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
5c00: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
5c10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
5c20: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 }.. /* Make
5c30: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 sure to operate
5c40: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 on the topmost
5c50: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 channel */. c
5c60: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
5c70: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a Channel(chan);..
5c80: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 /* Check if
5c90: 64 69 67 65 73 74 20 63 68 61 6e 6e 65 6c 20 2a digest channel *
5ca0: 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 /. if (Tcl_Ge
5cb0: 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 tChannelType(cha
5cc0: 6e 29 20 21 3d 20 26 64 69 67 65 73 74 43 68 61 n) != &digestCha
5cd0: 6e 6e 65 6c 54 79 70 65 29 20 7b 0a 09 54 63 6c nnelType) {..Tcl
5ce0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
5cf0: 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 6e 6e terp, "bad chann
5d00: 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 el \"", Tcl_GetC
5d10: 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 hannelName(chan)
5d20: 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 ,.. "\": not
5d30: 61 20 64 69 67 65 73 74 20 63 68 61 6e 6e 65 6c a digest channel
5d40: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 ", NULL);..Tcl_S
5d50: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
5d60: 72 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e 53 54 rp, "TLS", "UNST
5d70: 41 43 4b 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c ACK", "CHANNEL",
5d80: 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 "INVALID", (cha
5d90: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
5da0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
5db0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 }.. /* Pop
5dc0: 20 74 72 61 6e 73 66 6f 72 6d 20 66 72 6f 6d 20 transform from
5dd0: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 72 channel */. r
5de0: 65 74 75 72 6e 20 54 63 6c 5f 55 6e 73 74 61 63 eturn Tcl_Unstac
5df0: 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c kChannel(interp,
5e00: 20 63 68 61 6e 29 3b 0a 20 20 20 20 09 63 6c 69 chan);. .cli
5e10: 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 entData = client
5e20: 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a Data;.}../******
5e30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5e40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5e50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a *************/..
5e70: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
5e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5eb0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 --------. *. * D
5ec0: 69 67 65 73 74 49 6e 73 74 61 6e 63 65 4f 62 6a igestInstanceObj
5ed0: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 48 61 6e Cmd --. *. *.Han
5ee0: 64 6c 65 72 20 66 6f 72 20 64 69 67 65 73 74 20 dler for digest
5ef0: 63 6f 6d 6d 61 6e 64 20 69 6e 73 74 61 6e 63 65 command instance
5f00: 73 2e 20 55 73 65 64 20 74 6f 20 61 64 64 20 64 s. Used to add d
5f10: 61 74 61 20 74 6f 20 68 61 73 68 0a 20 2a 09 66 ata to hash. *.f
5f20: 75 6e 63 74 69 6f 6e 20 6f 72 20 72 65 74 72 69 unction or retri
5f30: 65 76 65 20 6d 65 73 73 61 67 65 20 64 69 67 65 eve message dige
5f40: 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e st.. *. * Return
5f50: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 s:. *.TCL_OK or
5f60: 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 TCL_ERROR. *. *
5f70: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
5f80: 09 41 64 64 73 20 64 61 74 61 20 74 6f 20 68 61 .Adds data to ha
5f90: 73 68 20 6f 72 20 72 65 74 75 72 6e 73 20 6d 65 sh or returns me
5fa0: 73 73 61 67 65 20 64 69 67 65 73 74 0a 20 2a 0a ssage digest. *.
5fb0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
5fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ff0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 -----. */.int Di
6000: 67 65 73 74 49 6e 73 74 61 6e 63 65 4f 62 6a 43 gestInstanceObjC
6010: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
6020: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
6030: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
6040: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
6050: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
6060: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 . DigestState
6070: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 *statePtr = (Di
6080: 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 gestState *) cli
6090: 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 69 6e 74 entData;. int
60a0: 20 66 6e 2c 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 fn, len = 0;.
60b0: 20 20 63 68 61 72 20 2a 62 75 66 20 3d 20 4e 55 char *buf = NU
60c0: 4c 4c 3b 0a 20 20 20 20 73 74 61 74 69 63 20 63 LL;. static c
60d0: 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e 73 74 61 onst char *insta
60e0: 6e 63 65 5f 66 6e 73 20 5b 5d 20 3d 20 7b 20 22 nce_fns [] = { "
60f0: 66 69 6e 61 6c 69 7a 65 22 2c 20 22 75 70 64 61 finalize", "upda
6100: 74 65 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 0a 20 20 te", NULL };..
6110: 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72 /* Validate ar
6120: 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 g count */. i
6130: 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f f (objc < 2 || o
6140: 62 6a 63 20 3e 20 33 29 20 7b 0a 09 54 63 6c 5f bjc > 3) {..Tcl_
6150: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
6160: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 66 erp, 1, objv, "f
6170: 75 6e 63 74 69 6f 6e 20 3f 64 61 74 61 3f 22 29 unction ?data?")
6180: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
6190: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
61a0: 2f 2a 20 47 65 74 20 66 75 6e 63 74 69 6f 6e 20 /* Get function
61b0: 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 */. if (Tcl_G
61c0: 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 etIndexFromObj(i
61d0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 nterp, objv[1],
61e0: 69 6e 73 74 61 6e 63 65 5f 66 6e 73 2c 20 22 66 instance_fns, "f
61f0: 75 6e 63 74 69 6f 6e 22 2c 20 30 2c 20 26 66 6e unction", 0, &fn
6200: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
6210: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
6220: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
6230: 44 6f 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 Do function */.
6240: 20 20 20 69 66 20 28 66 6e 29 20 7b 0a 09 2f 2a if (fn) {../*
6250: 20 47 65 74 20 64 61 74 61 20 6f 72 20 72 65 74 Get data or ret
6260: 75 72 6e 20 65 72 72 6f 72 20 69 66 20 6e 6f 6e urn error if non
6270: 65 20 2a 2f 0a 09 69 66 20 28 6f 62 6a 63 20 3d e */..if (objc =
6280: 3d 20 33 29 20 7b 0a 09 20 20 20 20 62 75 66 20 = 3) {.. buf
6290: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 = Tcl_GetByteArr
62a0: 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 ayFromObj(objv[2
62b0: 5d 2c 20 26 6c 65 6e 29 3b 0a 09 7d 20 65 6c 73 ], &len);..} els
62c0: 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f 57 72 6f e {.. Tcl_Wro
62d0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
62e0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 75 70 64 61 , 1, objv, "upda
62f0: 74 65 20 64 61 74 61 22 29 3b 0a 09 20 20 20 20 te data");..
6300: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
6310: 3b 0a 09 7d 0a 0a 09 2f 2a 20 55 70 64 61 74 65 ;..}.../* Update
6320: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a hash function *
6330: 2f 0a 09 69 66 20 28 21 44 69 67 65 73 74 55 70 /..if (!DigestUp
6340: 64 61 74 65 28 73 74 61 74 65 50 74 72 2c 20 62 date(statePtr, b
6350: 75 66 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e uf, (size_t) len
6360: 2c 20 31 29 29 20 7b 0a 09 20 20 20 20 72 65 74 , 1)) {.. ret
6370: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
6380: 7d 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a }.. } else {.
6390: 09 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 68 61 73 ./* Finalize has
63a0: 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 63 h function and c
63b0: 61 6c 63 75 6c 61 74 65 20 6d 65 73 73 61 67 65 alculate message
63c0: 20 64 69 67 65 73 74 20 2a 2f 0a 09 69 66 20 28 digest */..if (
63d0: 44 69 67 65 73 74 46 69 6e 61 6c 69 7a 65 28 69 DigestFinalize(i
63e0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c nterp, statePtr,
63f0: 20 4e 55 4c 4c 29 20 21 3d 20 54 43 4c 5f 4f 4b NULL) != TCL_OK
6400: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 ) {.. return
6410: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 TCL_ERROR;..}...
6420: 54 63 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e Tcl_DeleteComman
6430: 64 46 72 6f 6d 54 6f 6b 65 6e 28 69 6e 74 65 72 dFromToken(inter
6440: 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 74 6f 6b p, statePtr->tok
6450: 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 en);. }. r
6460: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
6470: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
6480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
64a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
64b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
64c0: 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 44 65 6c DigestCommandDel
64d0: 65 74 65 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a eteHandler --. *
64e0: 0a 20 2a 09 20 43 61 6c 6c 62 61 63 6b 20 74 6f . *. Callback to
64f0: 20 63 6c 65 61 6e 2d 75 70 20 77 68 65 6e 20 64 clean-up when d
6500: 69 67 65 73 74 20 69 6e 73 74 61 6e 63 65 20 63 igest instance c
6510: 6f 6d 6d 61 6e 64 20 69 73 20 64 65 6c 65 74 65 ommand is delete
6520: 64 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 d.. *. * Returns
6530: 3a 0a 20 2a 09 4e 6f 74 68 69 6e 67 0a 20 2a 0a :. *.Nothing. *.
6540: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
6550: 0a 20 2a 09 44 65 73 74 72 6f 79 73 20 73 74 61 . *.Destroys sta
6560: 74 65 20 69 6e 66 6f 20 73 74 72 75 63 74 75 72 te info structur
6570: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d e. *. *---------
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 2d 2d ----------------
65b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 ----------. */.v
65c0: 6f 69 64 20 44 69 67 65 73 74 43 6f 6d 6d 61 6e oid DigestComman
65d0: 64 44 65 6c 65 74 65 48 61 6e 64 6c 65 72 28 43 dDeleteHandler(C
65e0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
65f0: 44 61 74 61 29 20 7b 0a 20 20 20 20 44 69 67 65 Data) {. Dige
6600: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 stState *statePt
6610: 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 r = (DigestState
6620: 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a *) clientData;.
6630: 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 . /* Clean-up
6640: 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 53 74 */. DigestSt
6650: 61 74 65 46 72 65 65 28 73 74 61 74 65 50 74 72 ateFree(statePtr
6660: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d );.}../*. *-----
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 0a 20 --------------.
66b0: 2a 0a 20 2a 20 44 69 67 65 73 74 43 6f 6d 6d 61 *. * DigestComma
66c0: 6e 64 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a ndHandler --. *.
66d0: 20 2a 09 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 *. Create comma
66e0: 6e 64 20 74 6f 20 61 6c 6c 6f 77 20 75 73 65 72 nd to allow user
66f0: 20 74 6f 20 61 64 64 20 64 61 74 61 20 74 6f 20 to add data to
6700: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 hash function..
6710: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a *. * Returns:. *
6720: 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 .TCL_OK or TCL_E
6730: 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 RROR. *. * Side
6740: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 effects:. *.Crea
6750: 74 65 73 20 63 6f 6d 6d 61 6e 64 20 6f 72 20 65 tes command or e
6760: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a rror message. *.
6770: 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
67b0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 -----. */.int Di
67c0: 67 65 73 74 43 6f 6d 6d 61 6e 64 48 61 6e 64 6c gestCommandHandl
67d0: 65 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 er(Tcl_Interp *i
67e0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a nterp, Tcl_Obj *
67f0: 63 6d 64 4f 62 6a 2c 20 63 6f 6e 73 74 20 45 56 cmdObj, const EV
6800: 50 5f 4d 44 20 2a 6d 64 2c 0a 09 63 6f 6e 73 74 P_MD *md,..const
6810: 20 45 56 50 5f 43 49 50 48 45 52 20 2a 63 69 70 EVP_CIPHER *cip
6820: 68 65 72 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c her, int format,
6830: 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a Tcl_Obj *keyObj
6840: 2c 20 45 56 50 5f 4d 41 43 20 2a 6d 61 63 29 20 , EVP_MAC *mac)
6850: 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 {. DigestStat
6860: 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20 e *statePtr;.
6870: 20 63 68 61 72 20 2a 63 6d 64 4e 61 6d 65 20 3d char *cmdName =
6880: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
6890: 6f 6d 4f 62 6a 28 63 6d 64 4f 62 6a 2c 20 4e 55 omObj(cmdObj, NU
68a0: 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 LL);.. /* Cre
68b0: 61 74 65 20 73 74 61 74 65 20 64 61 74 61 20 73 ate state data s
68c0: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 tructure */.
68d0: 69 66 20 28 28 73 74 61 74 65 50 74 72 20 3d 20 if ((statePtr =
68e0: 44 69 67 65 73 74 53 74 61 74 65 4e 65 77 28 69 DigestStateNew(i
68f0: 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74 29 29 20 nterp, format))
6900: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f == NULL) {..Tcl_
6910: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
6920: 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20 61 6c 6c erp, "Memory all
6930: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c 20 ocation error",
6940: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
6950: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
6960: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
6970: 20 49 6e 69 74 69 61 6c 69 7a 65 20 68 61 73 68 Initialize hash
6980: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 function */.
6990: 20 69 66 20 28 44 69 67 65 73 74 49 6e 69 74 69 if (DigestIniti
69a0: 61 6c 69 7a 65 28 69 6e 74 65 72 70 2c 20 73 74 alize(interp, st
69b0: 61 74 65 50 74 72 2c 20 6d 64 2c 20 63 69 70 68 atePtr, md, ciph
69c0: 65 72 2c 20 6b 65 79 4f 62 6a 2c 20 6d 61 63 29 er, keyObj, mac)
69d0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
69e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
69f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
6a00: 72 65 61 74 65 20 69 6e 73 74 61 6e 63 65 20 63 reate instance c
6a10: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 73 74 ommand */. st
6a20: 61 74 65 50 74 72 2d 3e 74 6f 6b 65 6e 20 3d 20 atePtr->token =
6a30: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
6a40: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 63 6d 64 mand(interp, cmd
6a50: 4e 61 6d 65 2c 20 44 69 67 65 73 74 49 6e 73 74 Name, DigestInst
6a60: 61 6e 63 65 4f 62 6a 43 6d 64 2c 0a 09 28 43 6c anceObjCmd,..(Cl
6a70: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 ientData) stateP
6a80: 74 72 2c 20 44 69 67 65 73 74 43 6f 6d 6d 61 6e tr, DigestComman
6a90: 64 44 65 6c 65 74 65 48 61 6e 64 6c 65 72 29 3b dDeleteHandler);
6aa0: 0a 0a 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 .. /* Return
6ab0: 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a command name */.
6ac0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
6ad0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 63 6d 64 sult(interp, cmd
6ae0: 4f 62 6a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Obj);. return
6af0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 2a TCL_OK;.}.../**
6b00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6b10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6b20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6b30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6b40: 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d */../*. *-------
6b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
6b90: 20 2a 20 44 69 67 65 73 74 44 61 74 61 48 61 6e * DigestDataHan
6ba0: 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 dler --. *. *.Re
6bb0: 74 75 72 6e 20 6d 65 73 73 61 67 65 20 64 69 67 turn message dig
6bc0: 65 73 74 20 66 6f 72 20 64 61 74 61 20 75 73 69 est for data usi
6bd0: 6e 67 20 75 73 65 72 20 73 70 65 63 69 66 69 65 ng user specifie
6be0: 64 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e d hash function.
6bf0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a . *. * Returns:.
6c00: 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c *.TCL_OK or TCL
6c10: 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 _ERROR. *. * Sid
6c20: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 e effects:. *.Se
6c30: 74 73 20 72 65 73 75 6c 74 20 74 6f 20 6d 65 73 ts result to mes
6c40: 73 61 67 65 20 64 69 67 65 73 74 20 6f 72 20 65 sage digest or e
6c50: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a rror message. *.
6c60: 20 2a 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 2d 2d 2d 2d 2d 2d 2d ----------------
6ca0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 0a 44 69 -----. */.int.Di
6cb0: 67 65 73 74 44 61 74 61 48 61 6e 64 6c 65 72 28 gestDataHandler(
6cc0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
6cd0: 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 64 61 74 rp, Tcl_Obj *dat
6ce0: 61 4f 62 6a 2c 20 63 6f 6e 73 74 20 45 56 50 5f aObj, const EVP_
6cf0: 4d 44 20 2a 6d 64 2c 0a 09 63 6f 6e 73 74 20 45 MD *md,..const E
6d00: 56 50 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 VP_CIPHER *ciphe
6d10: 72 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c 20 54 r, int format, T
6d20: 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 2c 20 cl_Obj *keyObj,
6d30: 45 56 50 5f 4d 41 43 20 2a 6d 61 63 29 20 7b 0a EVP_MAC *mac) {.
6d40: 20 20 20 20 63 68 61 72 20 2a 64 61 74 61 3b 0a char *data;.
6d50: 20 20 20 20 69 6e 74 20 64 61 74 61 5f 6c 65 6e int data_len
6d60: 3b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 ;. DigestStat
6d70: 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 0a 20 20 e *statePtr;..
6d80: 20 20 2f 2a 20 47 65 74 20 64 61 74 61 20 2a 2f /* Get data */
6d90: 0a 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f . data = Tcl_
6da0: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d GetByteArrayFrom
6db0: 4f 62 6a 28 64 61 74 61 4f 62 6a 2c 20 26 64 61 Obj(dataObj, &da
6dc0: 74 61 5f 6c 65 6e 29 3b 0a 20 20 20 20 69 66 20 ta_len);. if
6dd0: 28 64 61 74 61 20 3d 3d 20 4e 55 4c 4c 29 20 7b (data == NULL) {
6de0: 0a 09 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 ..Tcl_SetResult(
6df0: 69 6e 74 65 72 70 2c 20 22 4e 6f 20 64 61 74 61 interp, "No data
6e00: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 ", NULL);..retur
6e10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
6e20: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 }.. /* Creat
6e30: 65 20 73 74 61 74 65 20 64 61 74 61 20 73 74 72 e state data str
6e40: 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 66 ucture */. if
6e50: 20 28 28 73 74 61 74 65 50 74 72 20 3d 20 44 69 ((statePtr = Di
6e60: 67 65 73 74 53 74 61 74 65 4e 65 77 28 69 6e 74 gestStateNew(int
6e70: 65 72 70 2c 20 66 6f 72 6d 61 74 29 29 20 3d 3d erp, format)) ==
6e80: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 NULL) {..Tcl_Ap
6e90: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
6ea0: 70 2c 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 p, "Memory alloc
6eb0: 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c 20 28 63 ation error", (c
6ec0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 har *) NULL);..r
6ed0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
6ee0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
6ef0: 61 6c 63 20 44 69 67 65 73 74 2c 20 61 62 6f 72 alc Digest, abor
6f00: 74 20 66 6f 72 20 65 72 72 6f 72 20 2a 2f 0a 20 t for error */.
6f10: 20 20 20 69 66 20 28 44 69 67 65 73 74 49 6e 69 if (DigestIni
6f20: 74 69 61 6c 69 7a 65 28 69 6e 74 65 72 70 2c 20 tialize(interp,
6f30: 73 74 61 74 65 50 74 72 2c 20 6d 64 2c 20 63 69 statePtr, md, ci
6f40: 70 68 65 72 2c 20 6b 65 79 4f 62 6a 2c 20 6d 61 pher, keyObj, ma
6f50: 63 29 20 21 3d 20 54 43 4c 5f 4f 4b 20 7c 7c 0a c) != TCL_OK ||.
6f60: 09 44 69 67 65 73 74 55 70 64 61 74 65 28 73 74 .DigestUpdate(st
6f70: 61 74 65 50 74 72 2c 20 64 61 74 61 2c 20 28 73 atePtr, data, (s
6f80: 69 7a 65 5f 74 29 20 64 61 74 61 5f 6c 65 6e 2c ize_t) data_len,
6f90: 20 31 29 20 3d 3d 20 30 20 7c 7c 0a 09 44 69 67 1) == 0 ||..Dig
6fa0: 65 73 74 46 69 6e 61 6c 69 7a 65 28 69 6e 74 65 estFinalize(inte
6fb0: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 4e 55 rp, statePtr, NU
6fc0: 4c 4c 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b LL) != TCL_OK) {
6fd0: 0a 09 44 69 67 65 73 74 53 74 61 74 65 46 72 65 ..DigestStateFre
6fe0: 65 28 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 e(statePtr);..re
6ff0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
7000: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c }.. /* Cl
7010: 65 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 20 44 69 ean-up */. Di
7020: 67 65 73 74 53 74 61 74 65 46 72 65 65 28 73 74 gestStateFree(st
7030: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 72 65 74 atePtr);. ret
7040: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f urn TCL_OK;.}../
7050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7090: 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ***/../*. *-----
70a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
70b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
70c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
70d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
70e0: 2a 0a 20 2a 20 44 69 67 65 73 74 46 69 6c 65 48 *. * DigestFileH
70f0: 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 2a 09 andler --. *. *.
7100: 52 65 74 75 72 6e 20 6d 65 73 73 61 67 65 20 64 Return message d
7110: 69 67 65 73 74 20 66 6f 72 20 66 69 6c 65 20 75 igest for file u
7120: 73 69 6e 67 20 75 73 65 72 20 73 70 65 63 69 66 sing user specif
7130: 69 65 64 20 68 61 73 68 20 66 75 6e 63 74 69 6f ied hash functio
7140: 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 n.. *. * Returns
7150: 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 :. *.TCL_OK or T
7160: 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 CL_ERROR. *. * S
7170: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
7180: 52 65 73 75 6c 74 20 69 73 20 6d 65 73 73 61 67 Result is messag
7190: 65 20 64 69 67 65 73 74 20 6f 72 20 65 72 72 6f e digest or erro
71a0: 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d r message. *. *-
71b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
71c0: 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 --. */.int Diges
7200: 74 46 69 6c 65 48 61 6e 64 6c 65 72 28 54 63 6c tFileHandler(Tcl
7210: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
7220: 20 54 63 6c 5f 4f 62 6a 20 2a 66 69 6c 65 6e 61 Tcl_Obj *filena
7230: 6d 65 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 me, const EVP_MD
7240: 20 2a 6d 64 2c 0a 09 63 6f 6e 73 74 20 45 56 50 *md,..const EVP
7250: 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 2c _CIPHER *cipher,
7260: 20 69 6e 74 20 66 6f 72 6d 61 74 2c 20 54 63 6c int format, Tcl
7270: 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 2c 20 45 56 _Obj *keyObj, EV
7280: 50 5f 4d 41 43 20 2a 6d 61 63 29 20 7b 0a 20 20 P_MAC *mac) {.
7290: 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 DigestState *s
72a0: 74 61 74 65 50 74 72 3b 0a 20 20 20 20 54 63 6c tatePtr;. Tcl
72b0: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 20 3d 20 _Channel chan =
72c0: 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e NULL;. unsign
72d0: 65 64 20 63 68 61 72 20 62 75 66 5b 42 55 46 46 ed char buf[BUFF
72e0: 45 52 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 69 6e ER_SIZE];. in
72f0: 74 20 72 65 73 20 3d 20 54 43 4c 5f 4f 4b 2c 20 t res = TCL_OK,
7300: 6c 65 6e 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 len;.. /* Cre
7310: 61 74 65 20 73 74 61 74 65 20 64 61 74 61 20 73 ate state data s
7320: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 tructure */.
7330: 69 66 20 28 28 73 74 61 74 65 50 74 72 20 3d 20 if ((statePtr =
7340: 44 69 67 65 73 74 53 74 61 74 65 4e 65 77 28 69 DigestStateNew(i
7350: 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74 29 29 20 nterp, format))
7360: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f == NULL) {..Tcl_
7370: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
7380: 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20 61 6c 6c erp, "Memory all
7390: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c 20 ocation error",
73a0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
73b0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
73c0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
73d0: 20 4f 70 65 6e 20 66 69 6c 65 20 63 68 61 6e 6e Open file chann
73e0: 65 6c 2c 20 61 62 6f 72 74 20 66 6f 72 20 65 72 el, abort for er
73f0: 72 6f 72 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 ror */. chan
7400: 3d 20 54 63 6c 5f 46 53 4f 70 65 6e 46 69 6c 65 = Tcl_FSOpenFile
7410: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
7420: 66 69 6c 65 6e 61 6d 65 2c 20 22 72 62 22 2c 20 filename, "rb",
7430: 30 34 34 34 29 3b 0a 20 20 20 20 69 66 20 28 63 0444);. if (c
7440: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
7450: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 44 69 nel) NULL) {..Di
7460: 67 65 73 74 53 74 61 74 65 46 72 65 65 28 73 74 gestStateFree(st
7470: 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e atePtr);..return
7480: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
7490: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 }.. /* Config
74a0: 75 72 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 ure channel */.
74b0: 20 20 20 69 66 20 28 28 72 65 73 20 3d 20 54 63 if ((res = Tc
74c0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 l_SetChannelOpti
74d0: 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c on(interp, chan,
74e0: 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c "-translation",
74f0: 20 22 62 69 6e 61 72 79 22 29 29 20 3d 3d 20 54 "binary")) == T
7500: 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 67 6f 74 CL_ERROR) {..got
7510: 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 o done;. }.
7520: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c Tcl_SetChannel
7530: 42 75 66 66 65 72 53 69 7a 65 28 63 68 61 6e 2c BufferSize(chan,
7540: 20 42 55 46 46 45 52 5f 53 49 5a 45 29 3b 0a 0a BUFFER_SIZE);..
7550: 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a /* Initializ
7560: 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 e hash function
7570: 2a 2f 0a 20 20 20 20 69 66 20 28 28 72 65 73 20 */. if ((res
7580: 3d 20 44 69 67 65 73 74 49 6e 69 74 69 61 6c 69 = DigestInitiali
7590: 7a 65 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 ze(interp, state
75a0: 50 74 72 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c Ptr, md, cipher,
75b0: 20 6b 65 79 4f 62 6a 2c 20 6d 61 63 29 29 20 21 keyObj, mac)) !
75c0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 67 6f 74 = TCL_OK) {..got
75d0: 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 0a 20 o done;. }..
75e0: 20 20 20 2f 2a 20 52 65 61 64 20 66 69 6c 65 20 /* Read file
75f0: 64 61 74 61 20 61 6e 64 20 75 70 64 61 74 65 20 data and update
7600: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f hash function */
7610: 0a 20 20 20 20 77 68 69 6c 65 20 28 21 54 63 6c . while (!Tcl
7620: 5f 45 6f 66 28 63 68 61 6e 29 29 20 7b 0a 09 6c _Eof(chan)) {..l
7630: 65 6e 20 3d 20 54 63 6c 5f 52 65 61 64 52 61 77 en = Tcl_ReadRaw
7640: 28 63 68 61 6e 2c 20 28 63 68 61 72 20 2a 29 20 (chan, (char *)
7650: 62 75 66 2c 20 42 55 46 46 45 52 5f 53 49 5a 45 buf, BUFFER_SIZE
7660: 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e 20 30 29 );..if (len > 0)
7670: 20 7b 0a 09 20 20 20 20 69 66 20 28 21 44 69 67 {.. if (!Dig
7680: 65 73 74 55 70 64 61 74 65 28 73 74 61 74 65 50 estUpdate(stateP
7690: 74 72 2c 20 26 62 75 66 5b 30 5d 2c 20 28 73 69 tr, &buf[0], (si
76a0: 7a 65 5f 74 29 20 6c 65 6e 2c 20 31 29 29 20 7b ze_t) len, 1)) {
76b0: 0a 09 09 72 65 73 20 3d 20 54 43 4c 5f 45 52 52 ...res = TCL_ERR
76c0: 4f 52 3b 0a 09 09 67 6f 74 6f 20 64 6f 6e 65 3b OR;...goto done;
76d0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d .. }..}. }
76e0: 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a .. /* Finaliz
76f0: 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 e hash function
7700: 61 6e 64 20 63 61 6c 63 75 6c 61 74 65 20 6d 65 and calculate me
7710: 73 73 61 67 65 20 64 69 67 65 73 74 20 2a 2f 0a ssage digest */.
7720: 20 20 20 20 72 65 73 20 3d 20 44 69 67 65 73 74 res = Digest
7730: 46 69 6e 61 6c 69 7a 65 28 69 6e 74 65 72 70 2c Finalize(interp,
7740: 20 73 74 61 74 65 50 74 72 2c 20 4e 55 4c 4c 29 statePtr, NULL)
7750: 3b 0a 0a 64 6f 6e 65 3a 0a 20 20 20 20 2f 2a 20 ;..done:. /*
7760: 43 6c 6f 73 65 20 63 68 61 6e 6e 65 6c 20 2a 2f Close channel */
7770: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 43 6c 6f . if (Tcl_Clo
7780: 73 65 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 29 se(interp, chan)
7790: 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b == TCL_ERROR) {
77a0: 0a 09 72 65 73 20 3d 20 54 43 4c 5f 45 52 52 4f ..res = TCL_ERRO
77b0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
77c0: 20 43 6c 65 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 Clean-up */.
77d0: 20 44 69 67 65 73 74 53 74 61 74 65 46 72 65 65 DigestStateFree
77e0: 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 (statePtr);.
77f0: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f return res;.}../
7800: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7810: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7820: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7830: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7840: 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ***/../*. *-----
7850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
7890: 2a 0a 20 2a 20 47 65 74 44 69 67 65 73 74 20 2d *. * GetDigest -
78a0: 2d 20 47 65 74 20 6d 65 73 73 61 67 65 20 64 69 - Get message di
78b0: 67 65 73 74 0a 20 2a 0a 20 2a 20 52 65 74 75 72 gest. *. * Retur
78c0: 6e 73 3a 0a 20 2a 09 45 56 50 5f 4d 44 20 2a 20 ns:. *.EVP_MD *
78d0: 6f 72 20 4e 55 4c 4c 0a 20 2a 0a 20 2a 2d 2d 2d or NULL. *. *---
78e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
78f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7920: 0a 20 2a 2f 0a 45 56 50 5f 4d 44 20 2a 47 65 74 . */.EVP_MD *Get
7930: 44 69 67 65 73 74 28 54 63 6c 5f 49 6e 74 65 72 Digest(Tcl_Inter
7940: 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f p *interp, Tcl_O
7950: 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 69 6e 74 20 bj *objPtr, int
7960: 2a 66 6f 72 6d 61 74 29 20 7b 0a 20 20 20 20 63 *format) {. c
7970: 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 20 onst EVP_MD *md
7980: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 = NULL;. char
7990: 20 2a 64 69 67 65 73 74 4e 61 6d 65 20 3d 20 54 *digestName = T
79a0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
79b0: 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 4e 55 4c 4c Obj(objPtr, NULL
79c0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 64 69 67 65 );.. if (dige
79d0: 73 74 4e 61 6d 65 20 21 3d 20 4e 55 4c 4c 29 20 stName != NULL)
79e0: 7b 0a 09 6d 64 20 3d 20 45 56 50 5f 67 65 74 5f {..md = EVP_get_
79f0: 64 69 67 65 73 74 62 79 6e 61 6d 65 28 64 69 67 digestbyname(dig
7a00: 65 73 74 4e 61 6d 65 29 3b 0a 09 69 66 20 28 6d estName);..if (m
7a10: 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 d == NULL) {..
7a20: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
7a30: 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 76 61 lt(interp, "Inva
7a40: 6c 69 64 20 64 69 67 65 73 74 20 5c 22 22 2c 20 lid digest \"",
7a50: 64 69 67 65 73 74 4e 61 6d 65 2c 20 22 5c 22 22 digestName, "\""
7a60: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 , NULL);.. re
7a70: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 20 65 6c turn NULL;..} el
7a80: 73 65 20 69 66 20 28 6d 64 20 3d 3d 20 45 56 50 se if (md == EVP
7a90: 5f 73 68 61 6b 65 31 32 38 28 29 20 7c 7c 20 6d _shake128() || m
7aa0: 64 20 3d 3d 20 45 56 50 5f 73 68 61 6b 65 32 35 d == EVP_shake25
7ab0: 36 28 29 29 20 7b 0a 09 20 20 20 20 2a 66 6f 72 6()) {.. *for
7ac0: 6d 61 74 20 7c 3d 20 49 53 5f 58 4f 46 3b 0a 09 mat |= IS_XOF;..
7ad0: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 }. } else {..
7ae0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
7af0: 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 64 69 67 (interp, "No dig
7b00: 65 73 74 20 73 70 65 63 69 66 69 65 64 22 2c 20 est specified",
7b10: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
7b20: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ULL;. }. r
7b30: 65 74 75 72 6e 20 6d 64 3b 0a 7d 0a 0a 2f 2a 0a eturn md;.}../*.
7b40: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
7b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b80: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 47 65 74 43 -----. *. * GetC
7b90: 69 70 68 65 72 20 2d 2d 20 47 65 74 20 63 69 70 ipher -- Get cip
7ba0: 68 65 72 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e her. *. * Return
7bb0: 73 3a 0a 20 2a 09 45 56 50 5f 43 49 50 48 45 52 s:. *.EVP_CIPHER
7bc0: 20 2a 20 6f 72 20 4e 55 4c 4c 0a 20 2a 0a 20 2a * or NULL. *. *
7bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c10: 2d 2d 2d 0a 20 2a 2f 0a 45 56 50 5f 43 49 50 48 ---. */.EVP_CIPH
7c20: 45 52 20 2a 47 65 74 43 69 70 68 65 72 28 54 63 ER *GetCipher(Tc
7c30: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
7c40: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 , Tcl_Obj *objPt
7c50: 72 2c 20 69 6e 74 20 2a 74 79 70 65 29 20 7b 0a r, int *type) {.
7c60: 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 43 49 const EVP_CI
7c70: 50 48 45 52 20 2a 63 69 70 68 65 72 20 3d 20 4e PHER *cipher = N
7c80: 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 ULL;. char *c
7c90: 69 70 68 65 72 4e 61 6d 65 20 3d 20 54 63 6c 5f ipherName = Tcl_
7ca0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
7cb0: 28 6f 62 6a 50 74 72 2c 20 4e 55 4c 4c 29 3b 0a (objPtr, NULL);.
7cc0: 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 4e . if (cipherN
7cd0: 61 6d 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ame != NULL) {..
7ce0: 63 69 70 68 65 72 20 3d 20 45 56 50 5f 67 65 74 cipher = EVP_get
7cf0: 5f 63 69 70 68 65 72 62 79 6e 61 6d 65 28 63 69 _cipherbyname(ci
7d00: 70 68 65 72 4e 61 6d 65 29 3b 0a 09 2a 74 79 70 pherName);..*typ
7d10: 65 20 3d 20 54 59 50 45 5f 43 4d 41 43 3b 0a 09 e = TYPE_CMAC;..
7d20: 69 66 20 28 63 69 70 68 65 72 20 3d 3d 20 4e 55 if (cipher == NU
7d30: 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 LL) {.. Tcl_A
7d40: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
7d50: 72 70 2c 20 22 49 6e 76 61 6c 69 64 20 63 69 70 rp, "Invalid cip
7d60: 68 65 72 20 5c 22 22 2c 20 63 69 70 68 65 72 4e her \"", cipherN
7d70: 61 6d 65 2c 20 22 5c 22 22 2c 20 4e 55 4c 4c 29 ame, "\"", NULL)
7d80: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 ;.. return NU
7d90: 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 LL;..}. } els
7da0: 65 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 e {..Tcl_AppendR
7db0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e esult(interp, "N
7dc0: 6f 20 63 69 70 68 65 72 20 73 70 65 63 69 66 69 o cipher specifi
7dd0: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 ed", NULL);..ret
7de0: 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a urn NULL;. }.
7df0: 20 20 20 20 72 65 74 75 72 6e 20 63 69 70 68 65 return ciphe
7e00: 72 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d r;.}../*. *-----
7e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
7e50: 2a 0a 20 2a 20 47 65 74 4b 65 79 20 2d 2d 20 47 *. * GetKey -- G
7e60: 65 74 20 6b 65 79 0a 20 2a 0a 20 2a 20 52 65 74 et key. *. * Ret
7e70: 75 72 6e 73 3a 0a 20 2a 09 75 6e 73 69 67 6e 65 urns:. *.unsigne
7e80: 64 20 63 68 61 72 20 2a 20 6f 72 20 4e 55 4c 4c d char * or NULL
7e90: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
7ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 75 6e ---------. */.un
7ee0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 47 65 74 signed char *Get
7ef0: 4b 65 79 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a Key(Tcl_Interp *
7f00: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 interp, Tcl_Obj
7f10: 2a 6f 62 6a 50 74 72 2c 20 69 6e 74 20 2a 74 79 *objPtr, int *ty
7f20: 70 65 29 20 7b 0a 20 20 20 20 75 6e 73 69 67 6e pe) {. unsign
7f30: 65 64 20 63 68 61 72 20 2a 6b 65 79 20 3d 20 54 ed char *key = T
7f40: 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 cl_GetByteArrayF
7f50: 72 6f 6d 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 4e romObj(objPtr, N
7f60: 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 6b ULL);.. if (k
7f70: 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 ey == NULL) {..T
7f80: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
7f90: 69 6e 74 65 72 70 2c 20 22 4e 6f 20 6b 65 79 20 interp, "No key
7fa0: 73 70 65 63 69 66 69 65 64 22 2c 20 4e 55 4c 4c specified", NULL
7fb0: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
7fc0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 2a . }. if (*
7fd0: 74 79 70 65 20 3d 3d 20 54 59 50 45 5f 4d 44 29 type == TYPE_MD)
7fe0: 20 7b 0a 09 2a 74 79 70 65 20 3d 20 54 59 50 45 {..*type = TYPE
7ff0: 5f 48 4d 41 43 3b 0a 20 20 20 20 7d 0a 20 20 20 _HMAC;. }.
8000: 20 72 65 74 75 72 6e 20 6b 65 79 3b 0a 7d 0a 0a return key;.}..
8010: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
8020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8050: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 47 --------. *. * G
8060: 65 74 4d 41 43 20 2d 2d 20 47 65 74 20 4d 41 43 etMAC -- Get MAC
8070: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a . *. * Returns:.
8080: 20 2a 09 45 56 50 5f 4d 41 43 20 2a 20 6f 72 20 *.EVP_MAC * or
8090: 4e 55 4c 4c 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d NULL. *. *------
80a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
80b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
80c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
80d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
80e0: 2f 0a 45 56 50 5f 4d 41 43 20 2a 47 65 74 4d 41 /.EVP_MAC *GetMA
80f0: 43 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e C(Tcl_Interp *in
8100: 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6f terp, Tcl_Obj *o
8110: 62 6a 50 74 72 2c 20 69 6e 74 20 2a 74 79 70 65 bjPtr, int *type
8120: 29 20 7b 0a 20 20 20 20 45 56 50 5f 4d 41 43 20 ) {. EVP_MAC
8130: 2a 6d 61 63 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 *mac = NULL;.
8140: 20 63 68 61 72 20 2a 6d 61 63 4e 61 6d 65 20 3d char *macName =
8150: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
8160: 6f 6d 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 4e 55 omObj(objPtr, NU
8170: 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 6d 61 LL);.. if (ma
8180: 63 4e 61 6d 65 20 21 3d 20 4e 55 4c 4c 29 20 7b cName != NULL) {
8190: 0a 09 69 66 20 28 73 74 72 63 6d 70 28 6d 61 63 ..if (strcmp(mac
81a0: 4e 61 6d 65 2c 20 22 63 6d 61 63 22 29 20 3d 3d Name, "cmac") ==
81b0: 20 30 29 20 7b 0a 09 20 20 20 20 2a 74 79 70 65 0) {.. *type
81c0: 20 3d 20 54 59 50 45 5f 43 4d 41 43 3b 0a 09 7d = TYPE_CMAC;..}
81d0: 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d 70 else if (strcmp
81e0: 28 6d 61 63 4e 61 6d 65 2c 20 22 68 6d 61 63 22 (macName, "hmac"
81f0: 29 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 2a ) == 0) {.. *
8200: 74 79 70 65 20 3d 20 54 59 50 45 5f 48 4d 41 43 type = TYPE_HMAC
8210: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 ;..} else {..
8220: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
8230: 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 76 61 6c t(interp, "Inval
8240: 69 64 20 4d 41 43 20 5c 22 22 2c 20 6d 61 63 4e id MAC \"", macN
8250: 61 6d 65 2c 20 22 5c 22 22 2c 20 4e 55 4c 4c 29 ame, "\"", NULL)
8260: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 ;.. return NU
8270: 4c 4c 3b 0a 09 7d 0a 09 6d 61 63 20 3d 20 28 76 LL;..}..mac = (v
8280: 6f 69 64 20 2a 29 20 6d 61 63 4e 61 6d 65 3b 0a oid *) macName;.
8290: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 } else {..Tc
82a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
82b0: 6e 74 65 72 70 2c 20 22 4e 6f 20 4d 41 43 20 73 nterp, "No MAC s
82c0: 70 65 63 69 66 69 65 64 22 2c 20 4e 55 4c 4c 29 pecified", NULL)
82d0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
82e0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
82f0: 20 6d 61 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a mac;.}../******
8300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a *************/..
8340: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
8350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8380: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 --------. *. * D
8390: 69 67 65 73 74 4d 61 69 6e 20 2d 2d 0a 20 2a 0a igestMain --. *.
83a0: 20 2a 09 52 65 74 75 72 6e 20 6d 65 73 73 61 67 *.Return messag
83b0: 65 20 64 69 67 65 73 74 20 6f 72 20 4d 65 73 73 e digest or Mess
83c0: 61 67 65 20 41 75 74 68 65 6e 74 69 63 61 74 69 age Authenticati
83d0: 6f 6e 20 43 6f 64 65 20 28 4d 41 43 29 20 6f 66 on Code (MAC) of
83e0: 0a 20 2a 09 64 61 74 61 20 75 73 69 6e 67 20 75 . *.data using u
83f0: 73 65 72 20 73 70 65 63 69 66 69 65 64 20 68 61 ser specified ha
8400: 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a sh function.. *.
8410: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 * Returns:. *.T
8420: 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 CL_OK or TCL_ERR
8430: 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 OR. *. * Side ef
8440: 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 fects:. *.Sets r
8450: 65 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 67 65 esult to message
8460: 20 64 69 67 65 73 74 20 6f 72 20 65 72 72 6f 72 digest or error
8470: 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d message. *. *--
8480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
84d0: 20 44 69 67 65 73 74 4d 61 69 6e 28 69 6e 74 20 DigestMain(int
84e0: 74 79 70 65 2c 20 54 63 6c 5f 49 6e 74 65 72 70 type, Tcl_Interp
84f0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
8500: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
8510: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
8520: 20 69 6e 74 20 69 64 78 2c 20 73 74 61 72 74 20 int idx, start
8530: 3d 20 31 2c 20 66 6f 72 6d 61 74 20 3d 20 48 45 = 1, format = HE
8540: 58 5f 46 4f 52 4d 41 54 2c 20 72 65 73 20 3d 20 X_FORMAT, res =
8550: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 54 63 6c 5f TCL_OK;. Tcl_
8560: 4f 62 6a 20 2a 63 69 70 68 65 72 4f 62 6a 20 3d Obj *cipherObj =
8570: 20 4e 55 4c 4c 2c 20 2a 63 6d 64 4f 62 6a 20 3d NULL, *cmdObj =
8580: 20 4e 55 4c 4c 2c 20 2a 64 61 74 61 4f 62 6a 20 NULL, *dataObj
8590: 3d 20 4e 55 4c 4c 2c 20 2a 64 69 67 65 73 74 4f = NULL, *digestO
85a0: 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 bj = NULL;. T
85b0: 63 6c 5f 4f 62 6a 20 2a 66 69 6c 65 4f 62 6a 20 cl_Obj *fileObj
85c0: 3d 20 4e 55 4c 4c 2c 20 2a 6b 65 79 4f 62 6a 20 = NULL, *keyObj
85d0: 3d 20 4e 55 4c 4c 2c 20 2a 6d 61 63 4f 62 6a 20 = NULL, *macObj
85e0: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 = NULL;. cons
85f0: 74 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 20 t char *channel
8600: 3d 20 4e 55 4c 4c 2c 20 2a 6f 70 74 3b 0a 20 20 = NULL, *opt;.
8610: 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a const EVP_MD *
8620: 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 md = NULL;. c
8630: 6f 6e 73 74 20 45 56 50 5f 43 49 50 48 45 52 20 onst EVP_CIPHER
8640: 2a 63 69 70 68 65 72 20 3d 20 4e 55 4c 4c 3b 0a *cipher = NULL;.
8650: 20 20 20 20 45 56 50 5f 4d 41 43 20 2a 6d 61 63 EVP_MAC *mac
8660: 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a = NULL;.. /*
8670: 20 43 6c 65 61 72 20 69 6e 74 65 72 70 20 72 65 Clear interp re
8680: 73 75 6c 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f sult */. Tcl_
8690: 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 ResetResult(inte
86a0: 72 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c rp);.. /* Val
86b0: 69 64 61 74 65 20 61 72 67 20 63 6f 75 6e 74 20 idate arg count
86c0: 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 */. if (objc
86d0: 3c 20 33 20 7c 7c 20 6f 62 6a 63 20 3e 20 31 32 < 3 || objc > 12
86e0: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
86f0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
8700: 20 6f 62 6a 76 2c 20 22 3f 2d 62 69 6e 7c 2d 68 objv, "?-bin|-h
8710: 65 78 3f 20 3f 2d 63 69 70 68 65 72 20 6e 61 6d ex? ?-cipher nam
8720: 65 3f 20 3f 2d 64 69 67 65 73 74 20 6e 61 6d 65 e? ?-digest name
8730: 3f 20 3f 2d 6b 65 79 20 6b 65 79 3f 20 3f 2d 6d ? ?-key key? ?-m
8740: 61 63 20 6e 61 6d 65 3f 20 5b 2d 63 68 61 6e 6e ac name? [-chann
8750: 65 6c 20 63 68 61 6e 20 7c 20 2d 63 6f 6d 6d 61 el chan | -comma
8760: 6e 64 20 63 6d 64 4e 61 6d 65 20 7c 20 2d 66 69 nd cmdName | -fi
8770: 6c 65 20 66 69 6c 65 6e 61 6d 65 20 7c 20 3f 2d le filename | ?-
8780: 64 61 74 61 3f 20 64 61 74 61 5d 22 29 3b 0a 09 data? data]");..
8790: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
87a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
87b0: 53 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 20 Special case of
87c0: 66 69 72 73 74 20 61 72 67 20 69 73 20 64 69 67 first arg is dig
87d0: 65 73 74 2c 20 63 69 70 68 65 72 2c 20 6f 72 20 est, cipher, or
87e0: 6d 61 63 20 2a 2f 0a 20 20 20 20 6f 70 74 20 3d mac */. opt =
87f0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
8800: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 73 74 61 72 74 omObj(objv[start
8810: 5d 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69 66 ], NULL);. if
8820: 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 29 (opt[0] != '-')
8830: 20 7b 0a 09 69 66 20 28 74 79 70 65 20 3d 3d 20 {..if (type ==
8840: 54 59 50 45 5f 4d 44 20 7c 7c 20 74 79 70 65 20 TYPE_MD || type
8850: 3d 3d 20 54 59 50 45 5f 48 4d 41 43 29 20 7b 0a == TYPE_HMAC) {.
8860: 09 20 20 20 20 64 69 67 65 73 74 4f 62 6a 20 3d . digestObj =
8870: 20 6f 62 6a 76 5b 73 74 61 72 74 5d 3b 0a 09 20 objv[start];..
8880: 20 20 20 73 74 61 72 74 2b 2b 3b 0a 09 7d 20 65 start++;..} e
8890: 6c 73 65 20 69 66 20 28 74 79 70 65 20 3d 3d 20 lse if (type ==
88a0: 54 59 50 45 5f 43 4d 41 43 29 20 7b 0a 09 20 20 TYPE_CMAC) {..
88b0: 20 20 63 69 70 68 65 72 4f 62 6a 20 3d 20 6f 62 cipherObj = ob
88c0: 6a 76 5b 73 74 61 72 74 5d 3b 0a 09 20 20 20 20 jv[start];..
88d0: 73 74 61 72 74 2b 2b 3b 0a 09 7d 20 65 6c 73 65 start++;..} else
88e0: 20 69 66 20 28 74 79 70 65 20 3d 3d 20 54 59 50 if (type == TYP
88f0: 45 5f 4d 41 43 29 20 7b 0a 09 20 20 20 20 6d 61 E_MAC) {.. ma
8900: 63 4f 62 6a 20 3d 20 6f 62 6a 76 5b 73 74 61 72 cObj = objv[star
8910: 74 5d 3b 0a 09 20 20 20 20 73 74 61 72 74 2b 2b t];.. start++
8920: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ;..}. }..
8930: 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 73 20 2a /* Get options *
8940: 2f 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d /. for (idx =
8950: 20 73 74 61 72 74 3b 20 69 64 78 20 3c 20 6f 62 start; idx < ob
8960: 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 6f 70 jc; idx++) {..op
8970: 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e t = Tcl_GetStrin
8980: 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 69 64 gFromObj(objv[id
8990: 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 x], NULL);...if
89a0: 28 6f 70 74 5b 30 5d 20 21 3d 20 27 2d 27 29 20 (opt[0] != '-')
89b0: 7b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d {.. break;..}
89c0: 0a 0a 09 4f 50 54 46 4c 41 47 28 22 2d 62 69 6e ...OPTFLAG("-bin
89d0: 22 2c 20 66 6f 72 6d 61 74 2c 20 42 49 4e 5f 46 ", format, BIN_F
89e0: 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 46 4c 41 47 ORMAT);..OPTFLAG
89f0: 28 22 2d 62 69 6e 61 72 79 22 2c 20 66 6f 72 6d ("-binary", form
8a00: 61 74 2c 20 42 49 4e 5f 46 4f 52 4d 41 54 29 3b at, BIN_FORMAT);
8a10: 0a 09 4f 50 54 46 4c 41 47 28 22 2d 68 65 78 22 ..OPTFLAG("-hex"
8a20: 2c 20 66 6f 72 6d 61 74 2c 20 48 45 58 5f 46 4f , format, HEX_FO
8a30: 52 4d 41 54 29 3b 0a 09 4f 50 54 46 4c 41 47 28 RMAT);..OPTFLAG(
8a40: 22 2d 68 65 78 61 64 65 63 69 6d 61 6c 22 2c 20 "-hexadecimal",
8a50: 66 6f 72 6d 61 74 2c 20 48 45 58 5f 46 4f 52 4d format, HEX_FORM
8a60: 41 54 29 3b 0a 09 4f 50 54 53 54 52 28 22 2d 63 AT);..OPTSTR("-c
8a70: 68 61 6e 22 2c 20 63 68 61 6e 6e 65 6c 29 3b 0a han", channel);.
8a80: 09 4f 50 54 53 54 52 28 22 2d 63 68 61 6e 6e 65 .OPTSTR("-channe
8a90: 6c 22 2c 20 63 68 61 6e 6e 65 6c 29 3b 0a 09 4f l", channel);..O
8aa0: 50 54 4f 42 4a 28 22 2d 63 69 70 68 65 72 22 2c PTOBJ("-cipher",
8ab0: 20 63 69 70 68 65 72 4f 62 6a 29 3b 0a 09 4f 50 cipherObj);..OP
8ac0: 54 4f 42 4a 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c TOBJ("-command",
8ad0: 20 63 6d 64 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 cmdObj);..OPTOB
8ae0: 4a 28 22 2d 64 61 74 61 22 2c 20 64 61 74 61 4f J("-data", dataO
8af0: 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 64 bj);..OPTOBJ("-d
8b00: 69 67 65 73 74 22 2c 20 64 69 67 65 73 74 4f 62 igest", digestOb
8b10: 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 66 69 j);..OPTOBJ("-fi
8b20: 6c 65 22 2c 20 66 69 6c 65 4f 62 6a 29 3b 0a 09 le", fileObj);..
8b30: 4f 50 54 4f 42 4a 28 22 2d 66 69 6c 65 6e 61 6d OPTOBJ("-filenam
8b40: 65 22 2c 20 66 69 6c 65 4f 62 6a 29 3b 0a 09 4f e", fileObj);..O
8b50: 50 54 4f 42 4a 28 22 2d 6b 65 79 22 2c 20 6b 65 PTOBJ("-key", ke
8b60: 79 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 yObj);..OPTOBJ("
8b70: 2d 6d 61 63 22 2c 20 6d 61 63 4f 62 6a 29 3b 0a -mac", macObj);.
8b80: 0a 09 4f 50 54 42 41 44 28 22 6f 70 74 69 6f 6e ..OPTBAD("option
8b90: 22 2c 20 22 2d 62 69 6e 2c 20 2d 63 68 61 6e 6e ", "-bin, -chann
8ba0: 65 6c 2c 20 2d 63 69 70 68 65 72 2c 20 2d 63 6f el, -cipher, -co
8bb0: 6d 6d 61 6e 64 2c 20 2d 64 61 74 61 2c 20 2d 64 mmand, -data, -d
8bc0: 69 67 65 73 74 2c 20 2d 66 69 6c 65 2c 20 2d 66 igest, -file, -f
8bd0: 69 6c 65 6e 61 6d 65 2c 20 2d 68 65 78 2c 20 2d ilename, -hex, -
8be0: 6b 65 79 2c 20 6f 72 20 2d 6d 61 63 22 29 3b 0a key, or -mac");.
8bf0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
8c00: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
8c10: 20 49 66 20 6f 6e 6c 79 20 31 20 61 72 67 20 6c If only 1 arg l
8c20: 65 66 74 2c 20 69 74 27 73 20 74 68 65 20 64 61 eft, it's the da
8c30: 74 61 20 2a 2f 0a 20 20 20 20 69 66 20 28 69 64 ta */. if (id
8c40: 78 20 3c 20 6f 62 6a 63 20 26 26 20 64 61 74 61 x < objc && data
8c50: 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 Obj == NULL) {..
8c60: 64 61 74 61 4f 62 6a 20 3d 20 6f 62 6a 76 5b 69 dataObj = objv[i
8c70: 64 78 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 dx];. }..
8c80: 2f 2a 20 47 65 74 20 63 69 70 68 65 72 20 2a 2f /* Get cipher */
8c90: 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 4f . if (cipherO
8ca0: 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 bj != NULL) {..i
8cb0: 66 20 28 28 63 69 70 68 65 72 20 3d 20 47 65 74 f ((cipher = Get
8cc0: 43 69 70 68 65 72 28 69 6e 74 65 72 70 2c 20 63 Cipher(interp, c
8cd0: 69 70 68 65 72 4f 62 6a 2c 20 26 74 79 70 65 29 ipherObj, &type)
8ce0: 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 ) == NULL) {..
8cf0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
8d00: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 OR;..}. } els
8d10: 65 20 69 66 20 28 74 79 70 65 20 3d 3d 20 54 59 e if (type == TY
8d20: 50 45 5f 43 4d 41 43 29 20 7b 0a 09 54 63 6c 5f PE_CMAC) {..Tcl_
8d30: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
8d40: 65 72 70 2c 20 22 4e 6f 20 63 69 70 68 65 72 20 erp, "No cipher
8d50: 73 70 65 63 69 66 69 65 64 22 2c 20 4e 55 4c 4c specified", NULL
8d60: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
8d70: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
8d80: 20 2f 2a 20 47 65 74 20 6d 65 73 73 61 67 65 20 /* Get message
8d90: 64 69 67 65 73 74 20 2a 2f 0a 20 20 20 20 69 66 digest */. if
8da0: 20 28 64 69 67 65 73 74 4f 62 6a 20 21 3d 20 4e (digestObj != N
8db0: 55 4c 4c 29 20 7b 0a 09 69 66 20 28 28 6d 64 20 ULL) {..if ((md
8dc0: 3d 20 47 65 74 44 69 67 65 73 74 28 69 6e 74 65 = GetDigest(inte
8dd0: 72 70 2c 20 64 69 67 65 73 74 4f 62 6a 2c 20 26 rp, digestObj, &
8de0: 66 6f 72 6d 61 74 29 29 20 3d 3d 20 4e 55 4c 4c format)) == NULL
8df0: 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 ) {.. return
8e00: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 TCL_ERROR;..}.
8e10: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 74 79 70 } else if (typ
8e20: 65 20 3d 3d 20 54 59 50 45 5f 4d 44 20 7c 7c 20 e == TYPE_MD ||
8e30: 74 79 70 65 20 3d 3d 20 54 59 50 45 5f 48 4d 41 type == TYPE_HMA
8e40: 43 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 C) {..Tcl_Append
8e50: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
8e60: 4e 6f 20 64 69 67 65 73 74 20 73 70 65 63 69 66 No digest specif
8e70: 69 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ied", NULL);..re
8e80: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
8e90: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 }.. /* Ge
8ea0: 74 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 t key */. if
8eb0: 28 6b 65 79 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 (keyObj != NULL)
8ec0: 20 7b 0a 09 69 66 20 28 47 65 74 4b 65 79 28 69 {..if (GetKey(i
8ed0: 6e 74 65 72 70 2c 20 6b 65 79 4f 62 6a 2c 20 26 nterp, keyObj, &
8ee0: 74 79 70 65 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b type) == NULL) {
8ef0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
8f00: 5f 45 52 52 4f 52 3b 09 0a 09 7d 0a 20 20 20 20 _ERROR;...}.
8f10: 7d 20 65 6c 73 65 20 69 66 20 28 74 79 70 65 20 } else if (type
8f20: 21 3d 20 54 59 50 45 5f 4d 44 29 20 7b 0a 09 54 != TYPE_MD) {..T
8f30: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
8f40: 69 6e 74 65 72 70 2c 20 22 4e 6f 20 6b 65 79 20 interp, "No key
8f50: 73 70 65 63 69 66 69 65 64 22 2c 20 4e 55 4c 4c specified", NULL
8f60: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
8f70: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
8f80: 20 2f 2a 20 47 65 74 20 4d 41 43 20 2a 2f 0a 20 /* Get MAC */.
8f90: 20 20 20 69 66 20 28 6d 61 63 4f 62 6a 20 21 3d if (macObj !=
8fa0: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 28 6d NULL) {..if ((m
8fb0: 61 63 20 3d 20 47 65 74 4d 41 43 28 69 6e 74 65 ac = GetMAC(inte
8fc0: 72 70 2c 20 6d 61 63 4f 62 6a 2c 20 26 74 79 70 rp, macObj, &typ
8fd0: 65 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 e)) == NULL) {..
8fe0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
8ff0: 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 RROR;..}. } e
9000: 6c 73 65 20 69 66 20 28 74 79 70 65 20 3d 3d 20 lse if (type ==
9010: 54 59 50 45 5f 4d 41 43 29 20 7b 0a 09 54 63 6c TYPE_MAC) {..Tcl
9020: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
9030: 74 65 72 70 2c 20 22 4e 6f 20 4d 41 43 20 73 70 terp, "No MAC sp
9040: 65 63 69 66 69 65 64 22 2c 20 4e 55 4c 4c 29 3b ecified", NULL);
9050: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
9060: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
9070: 2a 20 43 61 6c 63 20 64 69 67 65 73 74 20 6f 6e * Calc digest on
9080: 20 66 69 6c 65 2c 20 73 74 61 63 6b 65 64 20 63 file, stacked c
9090: 68 61 6e 6e 65 6c 2c 20 75 73 69 6e 67 20 69 6e hannel, using in
90a0: 73 74 61 6e 63 65 20 63 6f 6d 6d 61 6e 64 2c 20 stance command,
90b0: 6f 72 20 64 61 74 61 20 62 6c 6f 62 20 2a 2f 0a or data blob */.
90c0: 20 20 20 20 69 66 20 28 66 69 6c 65 4f 62 6a 20 if (fileObj
90d0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 != NULL) {..res
90e0: 3d 20 44 69 67 65 73 74 46 69 6c 65 48 61 6e 64 = DigestFileHand
90f0: 6c 65 72 28 69 6e 74 65 72 70 2c 20 66 69 6c 65 ler(interp, file
9100: 4f 62 6a 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c Obj, md, cipher,
9110: 20 66 6f 72 6d 61 74 20 7c 20 74 79 70 65 2c 20 format | type,
9120: 6b 65 79 4f 62 6a 2c 20 6d 61 63 29 3b 0a 20 20 keyObj, mac);.
9130: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 68 61 } else if (cha
9140: 6e 6e 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a nnel != NULL) {.
9150: 09 72 65 73 20 3d 20 44 69 67 65 73 74 43 68 61 .res = DigestCha
9160: 6e 6e 65 6c 48 61 6e 64 6c 65 72 28 69 6e 74 65 nnelHandler(inte
9170: 72 70 2c 20 63 68 61 6e 6e 65 6c 2c 20 6d 64 2c rp, channel, md,
9180: 20 63 69 70 68 65 72 2c 20 66 6f 72 6d 61 74 20 cipher, format
9190: 7c 20 74 79 70 65 2c 20 6b 65 79 4f 62 6a 2c 20 | type, keyObj,
91a0: 6d 61 63 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 mac);. } else
91b0: 20 69 66 20 28 63 6d 64 4f 62 6a 20 21 3d 20 4e if (cmdObj != N
91c0: 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d 20 44 69 ULL) {..res = Di
91d0: 67 65 73 74 43 6f 6d 6d 61 6e 64 48 61 6e 64 6c gestCommandHandl
91e0: 65 72 28 69 6e 74 65 72 70 2c 20 63 6d 64 4f 62 er(interp, cmdOb
91f0: 6a 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c 20 66 j, md, cipher, f
9200: 6f 72 6d 61 74 20 7c 20 74 79 70 65 2c 20 6b 65 ormat | type, ke
9210: 79 4f 62 6a 2c 20 6d 61 63 29 3b 0a 20 20 20 20 yObj, mac);.
9220: 7d 20 65 6c 73 65 20 69 66 20 28 64 61 74 61 4f } else if (dataO
9230: 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 bj != NULL) {..r
9240: 65 73 20 3d 20 44 69 67 65 73 74 44 61 74 61 48 es = DigestDataH
9250: 61 6e 64 6c 65 72 28 69 6e 74 65 72 70 2c 20 64 andler(interp, d
9260: 61 74 61 4f 62 6a 2c 20 6d 64 2c 20 63 69 70 68 ataObj, md, ciph
9270: 65 72 2c 20 66 6f 72 6d 61 74 20 7c 20 74 79 70 er, format | typ
9280: 65 2c 20 6b 65 79 4f 62 6a 2c 20 6d 61 63 29 3b e, keyObj, mac);
9290: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 . } else {..T
92a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
92b0: 69 6e 74 65 72 70 2c 20 22 4e 6f 20 6f 70 65 72 interp, "No oper
92c0: 61 74 69 6f 6e 20 73 70 65 63 69 66 69 65 64 3a ation specified:
92d0: 20 55 73 65 20 2d 63 68 61 6e 6e 65 6c 2c 20 2d Use -channel, -
92e0: 63 6f 6d 6d 61 6e 64 2c 20 2d 64 61 74 61 2c 20 command, -data,
92f0: 6f 72 20 2d 66 69 6c 65 20 6f 70 74 69 6f 6e 22 or -file option"
9300: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 73 20 3d 20 , NULL);..res =
9310: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
9320: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b . return res;
9330: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
9340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
9380: 20 2a 20 4d 65 73 73 61 67 65 20 44 69 67 65 73 * Message Diges
9390: 74 20 61 6e 64 20 4d 65 73 73 61 67 65 20 41 75 t and Message Au
93a0: 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 43 6f 64 thentication Cod
93b0: 65 20 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a e Commands --. *
93c0: 0a 20 2a 09 52 65 74 75 72 6e 20 4d 65 73 73 61 . *.Return Messa
93d0: 67 65 20 44 69 67 65 73 74 20 28 4d 44 29 20 6f ge Digest (MD) o
93e0: 72 20 4d 65 73 73 61 67 65 20 41 75 74 68 65 6e r Message Authen
93f0: 74 69 63 61 74 69 6f 6e 20 43 6f 64 65 20 28 4d tication Code (M
9400: 41 43 29 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 AC).. *. * Retur
9410: 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 ns:. *.TCL_OK or
9420: 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a TCL_ERROR. *. *
9430: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
9440: 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f *.Sets result to
9450: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 message digest
9460: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 or error message
9470: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
9480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 2f 0a 73 74 ---------. */.st
94c0: 61 74 69 63 20 69 6e 74 20 4d 64 4f 62 6a 43 6d atic int MdObjCm
94d0: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
94e0: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
94f0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
9500: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
9510: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
9520: 20 20 20 20 72 65 74 75 72 6e 20 44 69 67 65 73 return Diges
9530: 74 4d 61 69 6e 28 54 59 50 45 5f 4d 44 2c 20 69 tMain(TYPE_MD, i
9540: 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a nterp, objc, obj
9550: 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e v);.}..static in
9560: 74 20 43 4d 41 43 4f 62 6a 43 6d 64 28 43 6c 69 t CMACObjCmd(Cli
9570: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
9580: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
9590: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
95a0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
95b0: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 objv[]) {. r
95c0: 65 74 75 72 6e 20 44 69 67 65 73 74 4d 61 69 6e eturn DigestMain
95d0: 28 54 59 50 45 5f 43 4d 41 43 2c 20 69 6e 74 65 (TYPE_CMAC, inte
95e0: 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b rp, objc, objv);
95f0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 48 .}..static int H
9600: 4d 41 43 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 MACObjCmd(Client
9610: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
9620: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
9630: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
9640: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
9650: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 jv[]) {. retu
9660: 72 6e 20 44 69 67 65 73 74 4d 61 69 6e 28 54 59 rn DigestMain(TY
9670: 50 45 5f 48 4d 41 43 2c 20 69 6e 74 65 72 70 2c PE_HMAC, interp,
9680: 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a objc, objv);.}.
9690: 0a 73 74 61 74 69 63 20 69 6e 74 20 4d 41 43 4f .static int MACO
96a0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
96b0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
96c0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
96d0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
96e0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
96f0: 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 44 ) {. return D
9700: 69 67 65 73 74 4d 61 69 6e 28 54 59 50 45 5f 4d igestMain(TYPE_M
9710: 41 43 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 AC, interp, objc
9720: 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 0a 2f 2a 0a 20 , objv);.}../*.
9730: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
9740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9770: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 73 61 ----. *. * Messa
9780: 67 65 20 44 69 67 65 73 74 20 43 6f 6e 76 65 6e ge Digest Conven
9790: 69 65 6e 63 65 20 43 6f 6d 6d 61 6e 64 73 20 2d ience Commands -
97a0: 2d 0a 20 2a 0a 20 2a 09 43 6f 6e 76 65 6e 69 65 -. *. *.Convenie
97b0: 6e 63 65 20 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 nce commands for
97c0: 20 73 65 6c 65 63 74 20 6d 65 73 73 61 67 65 20 select message
97d0: 64 69 67 65 73 74 73 2e 0a 20 2a 0a 20 2a 20 52 digests.. *. * R
97e0: 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f eturns:. *.TCL_O
97f0: 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 K or TCL_ERROR.
9800: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
9810: 73 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c s:. *.Sets resul
9820: 74 20 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 t to message dig
9830: 65 73 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 est or error mes
9840: 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d sage. *. *------
9850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
9890: 2f 0a 20 23 64 65 66 69 6e 65 20 76 61 6c 69 64 /. #define valid
98a0: 61 74 65 5f 61 72 67 63 28 6f 62 6a 63 2c 20 6f ate_argc(objc, o
98b0: 62 6a 76 29 20 7b 20 5c 0a 20 20 20 20 69 66 20 bjv) { \. if
98c0: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 20 5c 0a (objc != 2) { \.
98d0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
98e0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
98f0: 76 2c 20 22 64 61 74 61 22 29 3b 20 5c 0a 09 72 v, "data"); \..r
9900: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
9910: 20 5c 0a 20 20 20 20 7d 20 5c 0a 7d 0a 20 0a 69 \. } \.}. .i
9920: 6e 74 20 4d 44 34 4f 62 6a 43 6d 64 28 43 6c 69 nt MD4ObjCmd(Cli
9930: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
9940: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
9950: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
9960: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
9970: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 76 objv[]) {. v
9980: 61 6c 69 64 61 74 65 5f 61 72 67 63 28 6f 62 6a alidate_argc(obj
9990: 63 2c 20 6f 62 6a 76 29 3b 0a 20 20 20 20 72 65 c, objv);. re
99a0: 74 75 72 6e 20 44 69 67 65 73 74 44 61 74 61 48 turn DigestDataH
99b0: 61 6e 64 6c 65 72 28 69 6e 74 65 72 70 2c 20 6f andler(interp, o
99c0: 62 6a 76 5b 31 5d 2c 20 45 56 50 5f 6d 64 34 28 bjv[1], EVP_md4(
99d0: 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f 46 4f 52 ), NULL, HEX_FOR
99e0: 4d 41 54 20 7c 20 54 59 50 45 5f 4d 44 2c 20 4e MAT | TYPE_MD, N
99f0: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69 ULL, NULL);.}..i
9a00: 6e 74 20 4d 44 35 4f 62 6a 43 6d 64 28 43 6c 69 nt MD5ObjCmd(Cli
9a10: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
9a20: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
9a30: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
9a40: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
9a50: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 76 objv[]) {. v
9a60: 61 6c 69 64 61 74 65 5f 61 72 67 63 28 6f 62 6a alidate_argc(obj
9a70: 63 2c 20 6f 62 6a 76 29 3b 0a 20 20 20 20 72 65 c, objv);. re
9a80: 74 75 72 6e 20 44 69 67 65 73 74 44 61 74 61 48 turn DigestDataH
9a90: 61 6e 64 6c 65 72 28 69 6e 74 65 72 70 2c 20 6f andler(interp, o
9aa0: 62 6a 76 5b 31 5d 2c 20 45 56 50 5f 6d 64 35 28 bjv[1], EVP_md5(
9ab0: 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f 46 4f 52 ), NULL, HEX_FOR
9ac0: 4d 41 54 20 7c 20 54 59 50 45 5f 4d 44 2c 20 4e MAT | TYPE_MD, N
9ad0: 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69 ULL, NULL);.}..i
9ae0: 6e 74 20 53 48 41 31 4f 62 6a 43 6d 64 28 43 6c nt SHA1ObjCmd(Cl
9af0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
9b00: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
9b10: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
9b20: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
9b30: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
9b40: 76 61 6c 69 64 61 74 65 5f 61 72 67 63 28 6f 62 validate_argc(ob
9b50: 6a 63 2c 20 6f 62 6a 76 29 3b 0a 20 20 20 20 72 jc, objv);. r
9b60: 65 74 75 72 6e 20 44 69 67 65 73 74 44 61 74 61 eturn DigestData
9b70: 48 61 6e 64 6c 65 72 28 69 6e 74 65 72 70 2c 20 Handler(interp,
9b80: 6f 62 6a 76 5b 31 5d 2c 20 45 56 50 5f 73 68 61 objv[1], EVP_sha
9b90: 31 28 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f 46 1(), NULL, HEX_F
9ba0: 4f 52 4d 41 54 20 7c 20 54 59 50 45 5f 4d 44 2c ORMAT | TYPE_MD,
9bb0: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a NULL, NULL);.}.
9bc0: 0a 69 6e 74 20 53 48 41 32 35 36 4f 62 6a 43 6d .int SHA256ObjCm
9bd0: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
9be0: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
9bf0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
9c00: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
9c10: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
9c20: 20 20 20 20 76 61 6c 69 64 61 74 65 5f 61 72 67 validate_arg
9c30: 63 28 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 20 c(objc, objv);.
9c40: 20 20 20 72 65 74 75 72 6e 20 44 69 67 65 73 74 return Digest
9c50: 44 61 74 61 48 61 6e 64 6c 65 72 28 69 6e 74 65 DataHandler(inte
9c60: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 45 56 50 rp, objv[1], EVP
9c70: 5f 73 68 61 32 35 36 28 29 2c 20 4e 55 4c 4c 2c _sha256(), NULL,
9c80: 20 48 45 58 5f 46 4f 52 4d 41 54 20 7c 20 54 59 HEX_FORMAT | TY
9c90: 50 45 5f 4d 44 2c 20 4e 55 4c 4c 2c 20 4e 55 4c PE_MD, NULL, NUL
9ca0: 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 53 48 41 35 31 L);.}..int SHA51
9cb0: 32 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 2ObjCmd(ClientDa
9cc0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
9cd0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
9ce0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
9cf0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
9d00: 5b 5d 29 20 7b 0a 20 20 20 20 76 61 6c 69 64 61 []) {. valida
9d10: 74 65 5f 61 72 67 63 28 6f 62 6a 63 2c 20 6f 62 te_argc(objc, ob
9d20: 6a 76 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 jv);. return
9d30: 44 69 67 65 73 74 44 61 74 61 48 61 6e 64 6c 65 DigestDataHandle
9d40: 72 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 r(interp, objv[1
9d50: 5d 2c 20 45 56 50 5f 73 68 61 35 31 32 28 29 2c ], EVP_sha512(),
9d60: 20 4e 55 4c 4c 2c 20 48 45 58 5f 46 4f 52 4d 41 NULL, HEX_FORMA
9d70: 54 20 7c 20 54 59 50 45 5f 4d 44 2c 20 4e 55 4c T | TYPE_MD, NUL
9d80: 4c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a L, NULL);.}../*.
9d90: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
9da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9dd0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
9de0: 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 73 20 2d DigestCommands -
9df0: 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65 20 64 -. *. *.Create d
9e00: 69 67 65 73 74 20 63 6f 6d 6d 61 6e 64 73 0a 20 igest commands.
9e10: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a *. * Returns:. *
9e20: 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 .TCL_OK or TCL_E
9e30: 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 RROR. *. * Side
9e40: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 effects:. *.Crea
9e50: 74 65 73 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a tes commands. *.
9e60: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
9e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9ea0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 54 6c -----. */.int Tl
9eb0: 73 5f 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 73 s_DigestCommands
9ec0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 (Tcl_Interp *int
9ed0: 65 72 70 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 erp) {. Tcl_C
9ee0: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
9ef0: 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 64 69 interp, "tls::di
9f00: 67 65 73 74 22 2c 20 4d 64 4f 62 6a 43 6d 64 2c gest", MdObjCmd,
9f10: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
9f20: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
9f30: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
9f40: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
9f50: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
9f60: 74 6c 73 3a 3a 6d 64 22 2c 20 4d 64 4f 62 6a 43 tls::md", MdObjC
9f70: 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
9f80: 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
9f90: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
9fa0: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
9fb0: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
9fc0: 2c 20 22 74 6c 73 3a 3a 63 6d 61 63 22 2c 20 43 , "tls::cmac", C
9fd0: 4d 41 43 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 MACObjCmd, (Clie
9fe0: 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f ntData) 0, (Tcl_
9ff0: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
a000: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
a010: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
a020: 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68 (interp, "tls::h
a030: 6d 61 63 22 2c 20 48 4d 41 43 4f 62 6a 43 6d 64 mac", HMACObjCmd
a040: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 , (ClientData) 0
a050: 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
a060: 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
a070: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
a080: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
a090: 22 74 6c 73 3a 3a 6d 61 63 22 2c 20 4d 41 43 4f "tls::mac", MACO
a0a0: 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
a0b0: 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
a0c0: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
a0d0: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
a0e0: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
a0f0: 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 64 34 22 2c erp, "tls::md4",
a100: 20 4d 44 34 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 MD4ObjCmd, (Cli
a110: 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c entData) 0, (Tcl
a120: 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
a130: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
a140: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
a150: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
a160: 6d 64 35 22 2c 20 4d 44 35 4f 62 6a 43 6d 64 2c md5", MD5ObjCmd,
a170: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
a180: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
a190: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
a1a0: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
a1b0: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
a1c0: 74 6c 73 3a 3a 73 68 61 31 22 2c 20 53 48 41 31 tls::sha1", SHA1
a1d0: 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 ObjCmd, (ClientD
a1e0: 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 ata) 0, (Tcl_Cmd
a1f0: 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
a200: 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
a210: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
a220: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 68 61 32 terp, "tls::sha2
a230: 35 36 22 2c 20 53 48 41 32 35 36 4f 62 6a 43 6d 56", SHA256ObjCm
a240: 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
a250: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
a260: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
a270: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
a280: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
a290: 20 22 74 6c 73 3a 3a 73 68 61 35 31 32 22 2c 20 "tls::sha512",
a2a0: 53 48 41 35 31 32 4f 62 6a 43 6d 64 2c 20 28 43 SHA512ObjCmd, (C
a2b0: 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
a2c0: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
a2d0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
a2e0: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
a2f0: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
a300: 3a 3a 75 6e 73 74 61 63 6b 22 2c 20 44 69 67 65 ::unstack", Dige
a310: 73 74 55 6e 73 74 61 63 6b 4f 62 6a 43 6d 64 2c stUnstackObjCmd,
a320: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
a330: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
a340: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
a350: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
a360: 0a 7d 0a 0a .}..