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 2a 2a 2a 2a d.#endif../*****
0350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a **************/.
0390: 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 73 74 72 75 ./*. * This stru
03a0: 63 74 75 72 65 20 64 65 66 69 6e 65 73 20 74 68 cture defines th
03b0: 65 20 70 65 72 2d 69 6e 73 74 61 6e 63 65 20 73 e per-instance s
03c0: 74 61 74 65 20 6f 66 20 61 20 64 69 67 65 73 74 tate of a digest
03d0: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 2a 2f 0a operation.. */.
03e0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 44 typedef struct D
03f0: 69 67 65 73 74 53 74 61 74 65 20 7b 0a 09 54 63 igestState {..Tc
0400: 6c 5f 43 68 61 6e 6e 65 6c 20 73 65 6c 66 3b 09 l_Channel self;.
0410: 2f 2a 20 54 68 69 73 20 73 6f 63 6b 65 74 20 63 /* This socket c
0420: 68 61 6e 6e 65 6c 20 2a 2f 0a 09 54 63 6c 5f 54 hannel */..Tcl_T
0430: 69 6d 65 72 54 6f 6b 65 6e 20 74 69 6d 65 72 3b imerToken timer;
0440: 09 2f 2a 20 54 69 6d 65 72 20 66 6f 72 20 72 65 ./* Timer for re
0450: 61 64 20 65 76 65 6e 74 73 20 2a 2f 0a 0a 09 69 ad events */...i
0460: 6e 74 20 66 6c 61 67 73 3b 09 09 2f 2a 20 43 68 nt flags;../* Ch
0470: 61 6e 20 63 6f 6e 66 69 67 20 66 6c 61 67 73 20 an config flags
0480: 2a 2f 0a 09 69 6e 74 20 77 61 74 63 68 4d 61 73 */..int watchMas
0490: 6b 3b 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 57 k;../* Current W
04a0: 61 74 63 68 50 72 6f 63 20 6d 61 73 6b 20 2a 2f atchProc mask */
04b0: 0a 09 69 6e 74 20 6d 6f 64 65 3b 09 09 2f 2a 20 ..int mode;../*
04c0: 43 75 72 72 65 6e 74 20 6d 6f 64 65 20 6f 66 20 Current mode of
04d0: 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20 2a parent channel *
04e0: 2f 0a 09 69 6e 74 20 66 6f 72 6d 61 74 3b 09 09 /..int format;..
04f0: 2f 2a 20 44 69 67 65 73 74 20 66 6f 72 6d 61 74 /* Digest format
0500: 20 61 6e 64 20 6f 70 65 72 61 74 69 6f 6e 20 2a and operation *
0510: 2f 0a 0a 09 54 63 6c 5f 49 6e 74 65 72 70 20 2a /...Tcl_Interp *
0520: 69 6e 74 65 72 70 3b 09 2f 2a 20 43 75 72 72 65 interp;./* Curre
0530: 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a nt interpreter *
0540: 2f 0a 09 45 56 50 5f 4d 44 5f 43 54 58 20 2a 63 /..EVP_MD_CTX *c
0550: 74 78 3b 09 2f 2a 20 4d 44 20 43 6f 6e 74 65 78 tx;./* MD Contex
0560: 74 20 2a 2f 0a 09 48 4d 41 43 5f 43 54 58 20 2a t */..HMAC_CTX *
0570: 68 63 74 78 3b 09 09 2f 2a 20 48 4d 41 43 20 63 hctx;../* HMAC c
0580: 6f 6e 74 65 78 74 20 2a 2f 0a 09 43 4d 41 43 5f ontext */..CMAC_
0590: 43 54 58 20 2a 63 63 74 78 3b 09 09 2f 2a 20 43 CTX *cctx;../* C
05a0: 4d 41 43 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 MAC context */..
05b0: 54 63 6c 5f 43 6f 6d 6d 61 6e 64 20 74 6f 6b 65 Tcl_Command toke
05c0: 6e 3b 09 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74 6f n;./* Command to
05d0: 6b 65 6e 20 2a 2f 0a 7d 20 44 69 67 65 73 74 53 ken */.} DigestS
05e0: 74 61 74 65 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d tate;../*. *----
05f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
0630: 20 2a 0a 20 2a 20 44 69 67 65 73 74 53 74 61 74 *. * DigestStat
0640: 65 4e 65 77 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 eNew --. *. *.Th
0650: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 72 65 61 is function crea
0660: 74 65 73 20 61 20 70 65 72 2d 69 6e 73 74 61 6e tes a per-instan
0670: 63 65 20 73 74 61 74 65 20 64 61 74 61 20 73 74 ce state data st
0680: 72 75 63 74 75 72 65 0a 20 2a 0a 20 2a 20 52 65 ructure. *. * Re
0690: 74 75 72 6e 73 3a 0a 20 2a 09 44 69 67 65 73 74 turns:. *.Digest
06a0: 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 structure point
06b0: 65 72 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 er. *. * Side ef
06c0: 66 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 fects:. *.Create
06d0: 73 20 73 74 72 75 63 74 75 72 65 0a 20 2a 0a 20 s structure. *.
06e0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
06f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0720: 2d 2d 2d 2d 0a 20 2a 2f 0a 44 69 67 65 73 74 53 ----. */.DigestS
0730: 74 61 74 65 20 2a 44 69 67 65 73 74 53 74 61 74 tate *DigestStat
0740: 65 4e 65 77 28 54 63 6c 5f 49 6e 74 65 72 70 20 eNew(Tcl_Interp
0750: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6f 72 *interp, int for
0760: 6d 61 74 29 20 7b 0a 20 20 20 20 44 69 67 65 73 mat) {. Diges
0770: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 tState *statePtr
0780: 3b 0a 0a 20 20 20 20 73 74 61 74 65 50 74 72 20 ;.. statePtr
0790: 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a = (DigestState *
07a0: 29 20 63 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 ) ckalloc((unsig
07b0: 6e 65 64 29 20 73 69 7a 65 6f 66 28 44 69 67 65 ned) sizeof(Dige
07c0: 73 74 53 74 61 74 65 29 29 3b 0a 20 20 20 20 69 stState));. i
07d0: 66 20 28 73 74 61 74 65 50 74 72 20 21 3d 20 4e f (statePtr != N
07e0: 55 4c 4c 29 20 7b 0a 09 6d 65 6d 73 65 74 28 73 ULL) {..memset(s
07f0: 74 61 74 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 tatePtr, 0, size
0800: 6f 66 28 44 69 67 65 73 74 53 74 61 74 65 29 29 of(DigestState))
0810: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 73 65 6c ;..statePtr->sel
0820: 66 09 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 54 68 f.= NULL;../* Th
0830: 69 73 20 73 6f 63 6b 65 74 20 63 68 61 6e 6e 65 is socket channe
0840: 6c 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e l */..statePtr->
0850: 74 69 6d 65 72 20 3d 20 4e 55 4c 4c 3b 09 09 2f timer = NULL;../
0860: 2a 20 54 69 6d 65 72 20 74 6f 20 66 6c 75 73 68 * Timer to flush
0870: 20 64 61 74 61 20 2a 2f 0a 09 73 74 61 74 65 50 data */..stateP
0880: 74 72 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 09 09 tr->flags = 0;..
0890: 2f 2a 20 43 68 61 6e 20 63 6f 6e 66 69 67 20 66 /* Chan config f
08a0: 6c 61 67 73 20 2a 2f 0a 09 73 74 61 74 65 50 74 lags */..statePt
08b0: 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 30 r->watchMask = 0
08c0: 3b 09 2f 2a 20 43 75 72 72 65 6e 74 20 57 61 74 ;./* Current Wat
08d0: 63 68 50 72 6f 63 20 6d 61 73 6b 20 2a 2f 0a 09 chProc mask */..
08e0: 73 74 61 74 65 50 74 72 2d 3e 6d 6f 64 65 09 3d statePtr->mode.=
08f0: 20 30 3b 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 0;../* Current
0900: 6d 6f 64 65 20 6f 66 20 70 61 72 65 6e 74 20 63 mode of parent c
0910: 68 61 6e 6e 65 6c 20 2a 2f 0a 09 73 74 61 74 65 hannel */..state
0920: 50 74 72 2d 3e 66 6f 72 6d 61 74 20 3d 20 66 6f Ptr->format = fo
0930: 72 6d 61 74 3b 09 2f 2a 20 44 69 67 65 73 74 20 rmat;./* Digest
0940: 66 6f 72 6d 61 74 20 61 6e 64 20 6f 70 65 72 61 format and opera
0950: 74 69 6f 6e 20 2a 2f 0a 09 73 74 61 74 65 50 74 tion */..statePt
0960: 72 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 r->interp = inte
0970: 72 70 3b 09 2f 2a 20 43 75 72 72 65 6e 74 20 69 rp;./* Current i
0980: 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 09 73 nterpreter */..s
0990: 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e tatePtr->ctx = N
09a0: 55 4c 4c 3b 09 09 2f 2a 20 4d 44 20 43 6f 6e 74 ULL;../* MD Cont
09b0: 65 78 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 ext */..statePtr
09c0: 2d 3e 68 63 74 78 20 3d 20 4e 55 4c 4c 3b 09 09 ->hctx = NULL;..
09d0: 2f 2a 20 48 4d 41 43 20 43 6f 6e 74 65 78 74 20 /* HMAC Context
09e0: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 63 */..statePtr->cc
09f0: 74 78 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 43 tx = NULL;../* C
0a00: 4d 41 43 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 09 MAC Context */..
0a10: 73 74 61 74 65 50 74 72 2d 3e 74 6f 6b 65 6e 20 statePtr->token
0a20: 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 43 6f 6d 6d = NULL;../* Comm
0a30: 61 6e 64 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 and token */.
0a40: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 73 74 }. return st
0a50: 61 74 65 50 74 72 3b 0a 7d 0a 0a 2f 2a 0a 20 2a atePtr;.}../*. *
0a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0aa0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 ---. *. * Digest
0ab0: 53 74 61 74 65 46 72 65 65 20 2d 2d 0a 20 2a 0a StateFree --. *.
0ac0: 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e *.This function
0ad0: 20 64 65 6c 65 74 65 73 20 61 20 64 69 67 65 73 deletes a diges
0ae0: 74 20 73 74 61 74 65 20 73 74 72 75 63 74 75 72 t state structur
0af0: 65 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a e. *. * Returns:
0b00: 0a 20 2a 09 4e 6f 74 68 69 6e 67 0a 20 2a 0a 20 . *.Nothing. *.
0b10: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
0b20: 20 2a 09 52 65 6d 6f 76 65 73 20 73 74 72 75 63 *.Removes struc
0b30: 74 75 72 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ture. *. *------
0b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
0b80: 2f 0a 76 6f 69 64 20 44 69 67 65 73 74 53 74 61 /.void DigestSta
0b90: 74 65 46 72 65 65 28 44 69 67 65 73 74 53 74 61 teFree(DigestSta
0ba0: 74 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a te *statePtr) {.
0bb0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
0bc0: 20 3d 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 == (DigestState
0bd0: 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 *) NULL) {..ret
0be0: 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 urn;. }..
0bf0: 2f 2a 20 52 65 6d 6f 76 65 20 70 65 6e 64 69 6e /* Remove pendin
0c00: 67 20 74 69 6d 65 72 20 2a 2f 0a 20 20 20 20 69 g timer */. i
0c10: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d f (statePtr->tim
0c20: 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 er != (Tcl_Timer
0c30: 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 Token) NULL) {..
0c40: 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 Tcl_DeleteTimerH
0c50: 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d andler(statePtr-
0c60: 3e 74 69 6d 65 72 29 3b 0a 20 20 20 20 7d 0a 0a >timer);. }..
0c70: 20 20 20 20 2f 2a 20 46 72 65 65 20 63 6f 6e 74 /* Free cont
0c80: 65 78 74 20 73 74 72 75 63 74 75 72 65 73 20 2a ext structures *
0c90: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 /. if (stateP
0ca0: 74 72 2d 3e 63 74 78 20 21 3d 20 28 45 56 50 5f tr->ctx != (EVP_
0cb0: 4d 44 5f 43 54 58 20 2a 29 20 4e 55 4c 4c 29 20 MD_CTX *) NULL)
0cc0: 7b 0a 09 45 56 50 5f 4d 44 5f 43 54 58 5f 66 72 {..EVP_MD_CTX_fr
0cd0: 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 ee(statePtr->ctx
0ce0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 );. }. if
0cf0: 28 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 20 (statePtr->hctx
0d00: 21 3d 20 28 48 4d 41 43 5f 43 54 58 20 2a 29 20 != (HMAC_CTX *)
0d10: 4e 55 4c 4c 29 20 7b 0a 09 48 4d 41 43 5f 43 54 NULL) {..HMAC_CT
0d20: 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d X_free(statePtr-
0d30: 3e 68 63 74 78 29 3b 0a 20 20 20 20 7d 0a 20 20 >hctx);. }.
0d40: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
0d50: 63 63 74 78 20 21 3d 20 28 43 4d 41 43 5f 43 54 cctx != (CMAC_CT
0d60: 58 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 43 4d X *) NULL) {..CM
0d70: 41 43 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 AC_CTX_free(stat
0d80: 65 50 74 72 2d 3e 63 63 74 78 29 3b 0a 20 20 20 ePtr->cctx);.
0d90: 20 7d 0a 20 20 20 20 63 6b 66 72 65 65 28 73 74 }. ckfree(st
0da0: 61 74 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 2a 2a atePtr);.}../***
0db0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0dc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0dd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0df0: 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d /../*. *--------
0e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
0e40: 2a 20 44 69 67 65 73 74 49 6e 69 74 69 61 6c 69 * DigestInitiali
0e50: 7a 65 20 2d 2d 0a 20 2a 0a 20 2a 09 49 6e 69 74 ze --. *. *.Init
0e60: 69 61 6c 69 7a 65 20 61 20 68 61 73 68 20 66 75 ialize a hash fu
0e70: 6e 63 74 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65 74 nction. *. * Ret
0e80: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 urns:. *.TCL_OK
0e90: 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 if successful or
0ea0: 20 54 43 4c 5f 45 52 52 4f 52 20 66 6f 72 20 66 TCL_ERROR for f
0eb0: 61 69 6c 75 72 65 20 77 69 74 68 20 72 65 73 75 ailure with resu
0ec0: 6c 74 20 73 65 74 0a 20 2a 09 74 6f 20 65 72 72 lt set. *.to err
0ed0: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 or message.. *.
0ee0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
0ef0: 20 2a 09 4e 6f 20 72 65 73 75 6c 74 20 6f 72 20 *.No result or
0f00: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a error message. *
0f10: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
0f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f50: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 ------. */.int D
0f60: 69 67 65 73 74 49 6e 69 74 69 61 6c 69 7a 65 28 igestInitialize(
0f70: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
0f80: 72 70 2c 20 44 69 67 65 73 74 53 74 61 74 65 20 rp, DigestState
0f90: 2a 73 74 61 74 65 50 74 72 2c 20 63 6f 6e 73 74 *statePtr, const
0fa0: 20 45 56 50 5f 4d 44 20 2a 6d 64 2c 0a 09 63 6f EVP_MD *md,..co
0fb0: 6e 73 74 20 45 56 50 5f 43 49 50 48 45 52 20 2a nst EVP_CIPHER *
0fc0: 63 69 70 68 65 72 2c 20 54 63 6c 5f 4f 62 6a 20 cipher, Tcl_Obj
0fd0: 2a 6b 65 79 4f 62 6a 2c 20 45 56 50 5f 4d 41 43 *keyObj, EVP_MAC
0fe0: 20 2a 6d 61 63 29 20 7b 0a 20 20 20 20 69 6e 74 *mac) {. int
0ff0: 20 6b 65 79 5f 6c 65 6e 20 3d 20 30 2c 20 72 65 key_len = 0, re
1000: 73 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 s = 0;. const
1010: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
1020: 6b 65 79 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 key = NULL;..
1030: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
1040: 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 ");.. /* Crea
1050: 74 65 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 te contexts */.
1060: 20 20 20 73 77 69 74 63 68 28 73 74 61 74 65 50 switch(stateP
1070: 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 30 78 46 tr->format & 0xF
1080: 46 30 29 20 7b 0a 20 20 20 20 63 61 73 65 20 54 F0) {. case T
1090: 59 50 45 5f 4d 44 3a 0a 09 73 74 61 74 65 50 74 YPE_MD:..statePt
10a0: 72 2d 3e 63 74 78 20 3d 20 45 56 50 5f 4d 44 5f r->ctx = EVP_MD_
10b0: 43 54 58 5f 6e 65 77 28 29 3b 0a 09 72 65 73 20 CTX_new();..res
10c0: 3d 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 = (statePtr->ctx
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 48 4d 41 43 3a 0a 09 73 74 61 74 65 50 74 72 _HMAC:..statePtr
1100: 2d 3e 68 63 74 78 20 3d 20 48 4d 41 43 5f 43 54 ->hctx = HMAC_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 68 63 74 78 20 (statePtr->hctx
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 63 61 73 65 20 54 59 50 45 5f ;. case TYPE_
1150: 43 4d 41 43 3a 0a 09 73 74 61 74 65 50 74 72 2d CMAC:..statePtr-
1160: 3e 63 63 74 78 20 3d 20 43 4d 41 43 5f 43 54 58 >cctx = CMAC_CTX
1170: 5f 6e 65 77 28 29 3b 0a 09 72 65 73 20 3d 20 28 _new();..res = (
1180: 73 74 61 74 65 50 74 72 2d 3e 63 63 74 78 20 21 statePtr->cctx !
1190: 3d 20 4e 55 4c 4c 29 3b 0a 09 62 72 65 61 6b 3b = NULL);..break;
11a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 . }.. if (
11b0: 21 72 65 73 29 20 7b 0a 09 54 63 6c 5f 41 70 70 !res) {..Tcl_App
11c0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
11d0: 2c 20 22 43 72 65 61 74 65 20 63 6f 6e 74 65 78 , "Create contex
11e0: 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45 41 t failed: ", REA
11f0: 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 SON(), NULL);..r
1200: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
1210: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 . }.. /* G
1220: 65 74 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 et key */. if
1230: 20 28 6b 65 79 4f 62 6a 20 21 3d 20 4e 55 4c 4c (keyObj != NULL
1240: 29 20 7b 0a 09 6b 65 79 20 3d 20 54 63 6c 5f 47 ) {..key = Tcl_G
1250: 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f etByteArrayFromO
1260: 62 6a 28 6b 65 79 4f 62 6a 2c 20 26 6b 65 79 5f bj(keyObj, &key_
1270: 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 len);. }..
1280: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 63 /* Initialize c
1290: 72 79 70 74 6f 67 72 61 70 68 79 20 66 75 6e 63 ryptography func
12a0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 77 69 74 tion */. swit
12b0: 63 68 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 ch(statePtr->for
12c0: 6d 61 74 20 26 20 30 78 46 46 30 29 20 7b 0a 20 mat & 0xFF0) {.
12d0: 20 20 20 63 61 73 65 20 54 59 50 45 5f 4d 44 3a case TYPE_MD:
12e0: 0a 09 72 65 73 20 3d 20 45 56 50 5f 44 69 67 65 ..res = EVP_Dige
12f0: 73 74 49 6e 69 74 5f 65 78 28 73 74 61 74 65 50 stInit_ex(stateP
1300: 74 72 2d 3e 63 74 78 2c 20 6d 64 2c 20 4e 55 4c tr->ctx, md, NUL
1310: 4c 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 L);..break;.
1320: 63 61 73 65 20 54 59 50 45 5f 48 4d 41 43 3a 0a case TYPE_HMAC:.
1330: 09 72 65 73 20 3d 20 48 4d 41 43 5f 49 6e 69 74 .res = HMAC_Init
1340: 5f 65 78 28 73 74 61 74 65 50 74 72 2d 3e 68 63 _ex(statePtr->hc
1350: 74 78 2c 20 28 63 6f 6e 73 74 20 76 6f 69 64 20 tx, (const void
1360: 2a 29 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 2c *) key, key_len,
1370: 20 6d 64 2c 20 4e 55 4c 4c 29 3b 0a 09 62 72 65 md, NULL);..bre
1380: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 59 50 ak;. case TYP
1390: 45 5f 43 4d 41 43 3a 0a 09 72 65 73 20 3d 20 43 E_CMAC:..res = C
13a0: 4d 41 43 5f 49 6e 69 74 28 73 74 61 74 65 50 74 MAC_Init(statePt
13b0: 72 2d 3e 63 63 74 78 2c 20 28 63 6f 6e 73 74 20 r->cctx, (const
13c0: 76 6f 69 64 20 2a 29 20 6b 65 79 2c 20 6b 65 79 void *) key, key
13d0: 5f 6c 65 6e 2c 20 63 69 70 68 65 72 2c 20 4e 55 _len, cipher, NU
13e0: 4c 4c 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 LL);..break;.
13f0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 21 72 65 73 }.. if (!res
1400: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
1410: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 esult(interp, "I
1420: 6e 69 74 69 61 6c 69 7a 65 20 66 61 69 6c 65 64 nitialize failed
1430: 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e : ", REASON(), N
1440: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ULL);..return TC
1450: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
1460: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
1470: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ;.}../*. *------
1480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
14b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
14c0: 0a 20 2a 20 44 69 67 65 73 74 55 70 64 61 74 65 . * DigestUpdate
14d0: 20 2d 2d 0a 20 2a 0a 20 2a 09 55 70 64 61 74 65 --. *. *.Update
14e0: 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e a hash function
14f0: 20 77 69 74 68 20 64 61 74 61 0a 20 2a 0a 20 2a with data. *. *
1500: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c Returns:. *.TCL
1510: 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 _OK if successfu
1520: 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 66 l or TCL_ERROR f
1530: 6f 72 20 66 61 69 6c 75 72 65 20 77 69 74 68 20 or failure with
1540: 72 65 73 75 6c 74 20 73 65 74 0a 20 2a 09 74 6f result set. *.to
1550: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 error message i
1560: 66 20 64 6f 5f 72 65 73 75 6c 74 20 69 73 20 74 f do_result is t
1570: 72 75 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 rue.. *. * Side
1580: 65 66 66 65 63 74 73 3a 0a 20 2a 09 41 64 64 73 effects:. *.Adds
1590: 20 62 75 66 20 64 61 74 61 20 74 6f 20 68 61 73 buf data to has
15a0: 68 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 73 65 h function or se
15b0: 74 73 20 72 65 73 75 6c 74 20 74 6f 20 65 72 72 ts result to err
15c0: 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a or message. *. *
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1610: 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 ---. */.int Dige
1620: 73 74 55 70 64 61 74 65 28 44 69 67 65 73 74 53 stUpdate(DigestS
1630: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 tate *statePtr,
1640: 63 68 61 72 20 2a 62 75 66 2c 20 73 69 7a 65 5f char *buf, size_
1650: 74 20 72 65 61 64 2c 20 69 6e 74 20 64 6f 5f 72 t read, int do_r
1660: 65 73 75 6c 74 29 20 7b 0a 20 20 20 20 69 6e 74 esult) {. int
1670: 20 72 65 73 20 3d 20 30 3b 0a 0a 20 20 20 20 64 res = 0;.. d
1680: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
1690: 3b 0a 0a 20 20 20 20 73 77 69 74 63 68 28 73 74 ;.. switch(st
16a0: 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 atePtr->format &
16b0: 20 30 78 46 46 30 29 20 7b 0a 20 20 20 20 63 61 0xFF0) {. ca
16c0: 73 65 20 54 59 50 45 5f 4d 44 3a 0a 20 20 20 20 se TYPE_MD:.
16d0: 20 20 20 20 72 65 73 20 3d 20 45 56 50 5f 44 69 res = EVP_Di
16e0: 67 65 73 74 55 70 64 61 74 65 28 73 74 61 74 65 gestUpdate(state
16f0: 50 74 72 2d 3e 63 74 78 2c 20 62 75 66 2c 20 72 Ptr->ctx, buf, r
1700: 65 61 64 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 ead);..break;.
1710: 20 20 63 61 73 65 20 54 59 50 45 5f 48 4d 41 43 case TYPE_HMAC
1720: 3a 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 :. res =
1730: 48 4d 41 43 5f 55 70 64 61 74 65 28 73 74 61 74 HMAC_Update(stat
1740: 65 50 74 72 2d 3e 68 63 74 78 2c 20 62 75 66 2c ePtr->hctx, buf,
1750: 20 72 65 61 64 29 3b 0a 09 62 72 65 61 6b 3b 0a read);..break;.
1760: 20 20 20 20 63 61 73 65 20 54 59 50 45 5f 43 4d case TYPE_CM
1770: 41 43 3a 0a 20 20 20 20 20 20 20 20 72 65 73 20 AC:. res
1780: 3d 20 43 4d 41 43 5f 55 70 64 61 74 65 28 73 74 = CMAC_Update(st
1790: 61 74 65 50 74 72 2d 3e 63 63 74 78 2c 20 62 75 atePtr->cctx, bu
17a0: 66 2c 20 72 65 61 64 29 3b 0a 09 62 72 65 61 6b f, read);..break
17b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
17c0: 28 21 72 65 73 20 26 26 20 64 6f 5f 72 65 73 75 (!res && do_resu
17d0: 6c 74 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e lt) {..Tcl_Appen
17e0: 64 52 65 73 75 6c 74 28 73 74 61 74 65 50 74 72 dResult(statePtr
17f0: 2d 3e 69 6e 74 65 72 70 2c 20 22 55 70 64 61 74 ->interp, "Updat
1800: 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45 41 e failed: ", REA
1810: 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 SON(), NULL);..r
1820: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
1830: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
1840: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a n TCL_OK;.}../*.
1850: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
1860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1890: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 -----. *. * Dige
18a0: 73 74 46 69 6e 61 6c 69 7a 65 20 2d 2d 0a 20 2a stFinalize --. *
18b0: 0a 20 2a 09 46 69 6e 61 6c 69 7a 65 20 61 20 68 . *.Finalize a h
18c0: 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 ash function and
18d0: 20 72 65 74 75 72 6e 20 74 68 65 20 6d 65 73 73 return the mess
18e0: 61 67 65 20 64 69 67 65 73 74 0a 20 2a 0a 20 2a age digest. *. *
18f0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c Returns:. *.TCL
1900: 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 _OK if successfu
1910: 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 66 l or TCL_ERROR f
1920: 6f 72 20 66 61 69 6c 75 72 65 20 77 69 74 68 20 or failure with
1930: 72 65 73 75 6c 74 20 73 65 74 0a 20 2a 09 74 6f result set. *.to
1940: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a error message..
1950: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
1960: 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75 ts:. *.Sets resu
1970: 6c 74 20 74 6f 20 6d 65 73 73 61 67 65 20 64 69 lt to message di
1980: 67 65 73 74 20 6f 72 20 61 6e 20 65 72 72 6f 72 gest or an error
1990: 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 2d message.. *. *-
19a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19e0: 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 --. */.int Diges
19f0: 74 46 69 6e 61 6c 69 7a 65 28 54 63 6c 5f 49 6e tFinalize(Tcl_In
1a00: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 44 69 terp *interp, Di
1a10: 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 gestState *state
1a20: 50 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 2a 2a 72 Ptr, Tcl_Obj **r
1a30: 65 73 75 6c 74 4f 62 6a 29 20 7b 0a 20 20 20 20 esultObj) {.
1a40: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 64 unsigned char md
1a50: 5f 62 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f _buf[EVP_MAX_MD_
1a60: 53 49 5a 45 5d 3b 0a 20 20 20 20 75 6e 73 69 67 SIZE];. unsig
1a70: 6e 65 64 20 69 6e 74 20 75 6c 65 6e 3b 0a 20 20 ned int ulen;.
1a80: 20 20 69 6e 74 20 72 65 73 20 3d 20 30 2c 20 6d int res = 0, m
1a90: 64 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 d_len = 0;..
1aa0: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
1ab0: 29 3b 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c );.. /* Final
1ac0: 69 7a 65 20 63 72 79 70 74 6f 67 72 61 70 68 79 ize cryptography
1ad0: 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 67 65 function and ge
1ae0: 74 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 t result */.
1af0: 73 77 69 74 63 68 28 73 74 61 74 65 50 74 72 2d switch(statePtr-
1b00: 3e 66 6f 72 6d 61 74 20 26 20 30 78 46 46 30 29 >format & 0xFF0)
1b10: 20 7b 0a 20 20 20 20 63 61 73 65 20 54 59 50 45 {. case TYPE
1b20: 5f 4d 44 3a 0a 09 69 66 20 28 21 28 73 74 61 74 _MD:..if (!(stat
1b30: 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 49 ePtr->format & I
1b40: 53 5f 58 4f 46 29 29 20 7b 0a 09 20 20 20 20 72 S_XOF)) {.. r
1b50: 65 73 20 3d 20 45 56 50 5f 44 69 67 65 73 74 46 es = EVP_DigestF
1b60: 69 6e 61 6c 5f 65 78 28 73 74 61 74 65 50 74 72 inal_ex(statePtr
1b70: 2d 3e 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26 ->ctx, md_buf, &
1b80: 75 6c 65 6e 29 3b 0a 09 20 20 20 20 6d 64 5f 6c ulen);.. md_l
1b90: 65 6e 20 3d 20 28 69 6e 74 29 20 75 6c 65 6e 3b en = (int) ulen;
1ba0: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
1bb0: 72 65 73 20 3d 20 45 56 50 5f 44 69 67 65 73 74 res = EVP_Digest
1bc0: 46 69 6e 61 6c 58 4f 46 28 73 74 61 74 65 50 74 FinalXOF(statePt
1bd0: 72 2d 3e 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20 r->ctx, md_buf,
1be0: 28 73 69 7a 65 5f 74 29 20 45 56 50 5f 4d 41 58 (size_t) EVP_MAX
1bf0: 5f 4d 44 5f 53 49 5a 45 29 3b 0a 09 20 20 20 20 _MD_SIZE);..
1c00: 6d 64 5f 6c 65 6e 20 3d 20 45 56 50 5f 4d 41 58 md_len = EVP_MAX
1c10: 5f 4d 44 5f 53 49 5a 45 3b 0a 09 7d 0a 09 62 72 _MD_SIZE;..}..br
1c20: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 59 eak;. case TY
1c30: 50 45 5f 48 4d 41 43 3a 0a 09 72 65 73 20 3d 20 PE_HMAC:..res =
1c40: 48 4d 41 43 5f 46 69 6e 61 6c 28 73 74 61 74 65 HMAC_Final(state
1c50: 50 74 72 2d 3e 68 63 74 78 2c 20 6d 64 5f 62 75 Ptr->hctx, md_bu
1c60: 66 2c 20 26 75 6c 65 6e 29 3b 0a 09 6d 64 5f 6c f, &ulen);..md_l
1c70: 65 6e 20 3d 20 28 69 6e 74 29 20 75 6c 65 6e 3b en = (int) ulen;
1c80: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 ..break;. cas
1c90: 65 20 54 59 50 45 5f 43 4d 41 43 3a 0a 09 73 69 e TYPE_CMAC:..si
1ca0: 7a 65 5f 74 20 73 69 7a 65 3b 0a 09 72 65 73 20 ze_t size;..res
1cb0: 3d 20 43 4d 41 43 5f 46 69 6e 61 6c 28 73 74 61 = CMAC_Final(sta
1cc0: 74 65 50 74 72 2d 3e 63 63 74 78 2c 20 6d 64 5f tePtr->cctx, md_
1cd0: 62 75 66 2c 20 26 73 69 7a 65 29 3b 0a 09 6d 64 buf, &size);..md
1ce0: 5f 6c 65 6e 20 3d 20 28 69 6e 74 29 20 73 69 7a _len = (int) siz
1cf0: 65 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d e;..break;. }
1d00: 0a 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20 .. if (!res)
1d10: 7b 0a 09 69 66 20 28 72 65 73 75 6c 74 4f 62 6a {..if (resultObj
1d20: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 == NULL) {..
1d30: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c Tcl_AppendResul
1d40: 74 28 69 6e 74 65 72 70 2c 20 22 46 69 6e 61 6c t(interp, "Final
1d50: 69 7a 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 ize failed: ", R
1d60: 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a EASON(), NULL);.
1d70: 09 7d 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 .}..return TCL_E
1d80: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
1d90: 20 2f 2a 20 52 65 74 75 72 6e 20 6d 65 73 73 61 /* Return messa
1da0: 67 65 20 64 69 67 65 73 74 20 61 73 20 65 69 74 ge digest as eit
1db0: 68 65 72 20 61 20 62 69 6e 61 72 79 20 6f 72 20 her a binary or
1dc0: 68 65 78 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 hex string */.
1dd0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
1de0: 66 6f 72 6d 61 74 20 26 20 42 49 4e 5f 46 4f 52 format & BIN_FOR
1df0: 4d 41 54 29 20 7b 0a 09 69 66 20 28 72 65 73 75 MAT) {..if (resu
1e00: 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b ltObj == NULL) {
1e10: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
1e20: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 Result(interp, T
1e30: 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f cl_NewByteArrayO
1e40: 62 6a 28 6d 64 5f 62 75 66 2c 20 6d 64 5f 6c 65 bj(md_buf, md_le
1e50: 6e 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 n));..} else {..
1e60: 20 20 20 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d *resultObj =
1e70: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 Tcl_NewByteArra
1e80: 79 4f 62 6a 28 6d 64 5f 62 75 66 2c 20 6d 64 5f yObj(md_buf, md_
1e90: 6c 65 6e 29 3b 0a 09 20 20 20 20 54 63 6c 5f 49 len);.. Tcl_I
1ea0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 2a 72 65 73 ncrRefCount(*res
1eb0: 75 6c 74 4f 62 6a 29 3b 0a 09 7d 0a 0a 20 20 20 ultObj);..}..
1ec0: 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f } else {..Tcl_O
1ed0: 62 6a 20 2a 6e 65 77 4f 62 6a 20 3d 20 54 63 6c bj *newObj = Tcl
1ee0: 5f 4e 65 77 4f 62 6a 28 29 3b 0a 09 75 6e 73 69 _NewObj();..unsi
1ef0: 67 6e 65 64 20 63 68 61 72 20 2a 70 74 72 20 3d gned char *ptr =
1f00: 20 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 Tcl_SetByteArra
1f10: 79 4c 65 6e 67 74 68 28 6e 65 77 4f 62 6a 2c 20 yLength(newObj,
1f20: 6d 64 5f 6c 65 6e 2a 32 29 3b 0a 0a 09 66 6f 72 md_len*2);...for
1f30: 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c (int i = 0; i <
1f40: 20 6d 64 5f 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a md_len; i++) {.
1f50: 09 20 20 20 20 2a 70 74 72 2b 2b 20 3d 20 68 65 . *ptr++ = he
1f60: 78 5b 28 6d 64 5f 62 75 66 5b 69 5d 20 3e 3e 20 x[(md_buf[i] >>
1f70: 34 29 20 26 20 30 78 30 46 5d 3b 0a 09 20 20 20 4) & 0x0F];..
1f80: 20 2a 70 74 72 2b 2b 20 3d 20 68 65 78 5b 6d 64 *ptr++ = hex[md
1f90: 5f 62 75 66 5b 69 5d 20 26 20 30 78 30 46 5d 3b _buf[i] & 0x0F];
1fa0: 0a 09 7d 0a 0a 09 69 66 20 28 72 65 73 75 6c 74 ..}...if (result
1fb0: 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 Obj == NULL) {..
1fc0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
1fd0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 6e 65 77 sult(interp, new
1fe0: 4f 62 6a 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a Obj);..} else {.
1ff0: 09 20 20 20 20 2a 72 65 73 75 6c 74 4f 62 6a 20 . *resultObj
2000: 3d 20 6e 65 77 4f 62 6a 3b 0a 09 20 20 20 20 54 = newObj;.. T
2010: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
2020: 2a 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 09 7d 0a *resultObj);..}.
2030: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
2040: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 2a 2a TCL_OK;.}../***
2050: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2060: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2070: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2080: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2090: 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d /../*. *--------
20a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
20e0: 2a 20 44 69 67 65 73 74 42 6c 6f 63 6b 4d 6f 64 * DigestBlockMod
20f0: 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 eProc --. *. *.T
2100: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 his function is
2110: 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67 invoked by the g
2120: 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 0a eneric IO level.
2130: 20 2a 09 74 6f 20 73 65 74 20 62 6c 6f 63 6b 69 *.to set blocki
2140: 6e 67 20 61 6e 64 20 6e 6f 6e 62 6c 6f 63 6b 69 ng and nonblocki
2150: 6e 67 20 6d 6f 64 65 73 2e 0a 20 2a 0a 20 2a 20 ng modes.. *. *
2160: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 30 20 69 66 Returns:. *.0 if
2170: 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 50 successful or P
2180: 4f 53 49 58 20 65 72 72 6f 72 20 63 6f 64 65 20 OSIX error code
2190: 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a if failed.. *. *
21a0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
21b0: 2a 09 53 65 74 73 20 74 68 65 20 64 65 76 69 63 *.Sets the devic
21c0: 65 20 69 6e 74 6f 20 62 6c 6f 63 6b 69 6e 67 20 e into blocking
21d0: 6f 72 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d or nonblocking m
21e0: 6f 64 65 2e 0a 20 2a 09 43 61 6e 20 63 61 6c 6c ode.. *.Can call
21f0: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 45 Tcl_SetChannelE
2200: 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d rror.. *. *-----
2210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
2250: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 69 */.static int Di
2260: 67 65 73 74 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f gestBlockModePro
2270: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 c(ClientData cli
2280: 65 6e 74 44 61 74 61 2c 20 69 6e 74 20 6d 6f 64 entData, int mod
2290: 65 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 e) {. DigestS
22a0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
22b0: 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 (DigestState *)
22c0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 clientData;..
22d0: 20 20 69 66 20 28 6d 6f 64 65 20 3d 3d 20 54 43 if (mode == TC
22e0: 4c 5f 4d 4f 44 45 5f 4e 4f 4e 42 4c 4f 43 4b 49 L_MODE_NONBLOCKI
22f0: 4e 47 29 20 7b 0a 09 73 74 61 74 65 50 74 72 2d NG) {..statePtr-
2300: 3e 66 6c 61 67 73 20 7c 3d 20 54 4c 53 5f 54 43 >flags |= TLS_TC
2310: 4c 5f 41 53 59 4e 43 3b 0a 20 20 20 20 7d 20 65 L_ASYNC;. } e
2320: 6c 73 65 20 7b 0a 09 73 74 61 74 65 50 74 72 2d lse {..statePtr-
2330: 3e 66 6c 61 67 73 20 26 3d 20 7e 28 54 4c 53 5f >flags &= ~(TLS_
2340: 54 43 4c 5f 41 53 59 4e 43 29 3b 0a 20 20 20 20 TCL_ASYNC);.
2350: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a }. return 0;.
2360: 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d }../*. *--------
2370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
23b0: 2a 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f * DigestClosePro
23c0: 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 c --. *. *.This
23d0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f function is invo
23e0: 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 ked by the gener
23f0: 69 63 20 49 4f 20 6c 65 76 65 6c 20 74 6f 20 70 ic IO level to p
2400: 65 72 66 6f 72 6d 0a 20 2a 09 63 68 61 6e 6e 65 erform. *.channe
2410: 6c 2d 74 79 70 65 20 73 70 65 63 69 66 69 63 20 l-type specific
2420: 63 6c 65 61 6e 75 70 20 77 68 65 6e 20 74 68 65 cleanup when the
2430: 20 63 68 61 6e 6e 65 6c 20 69 73 20 63 6c 6f 73 channel is clos
2440: 65 64 2e 20 41 6c 6c 0a 20 2a 09 71 75 65 75 65 ed. All. *.queue
2450: 64 20 6f 75 74 70 75 74 20 69 73 20 66 6c 75 73 d output is flus
2460: 68 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c hed prior to cal
2470: 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 ling this functi
2480: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e on.. *. * Return
2490: 73 3a 0a 20 2a 09 30 20 69 66 20 73 75 63 63 65 s:. *.0 if succe
24a0: 73 73 66 75 6c 20 6f 72 20 50 4f 53 49 58 20 65 ssful or POSIX e
24b0: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 66 61 69 rror code if fai
24c0: 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 led.. *. * Side
24d0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 44 65 6c 65 effects:. *.Dele
24e0: 74 65 73 20 73 74 6f 72 65 64 20 73 74 61 74 65 tes stored state
24f0: 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d data.. *. *----
2500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
2540: 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 43 6c */.int DigestCl
2550: 6f 73 65 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 oseProc(ClientDa
2560: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
2570: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
2580: 70 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 p) {. DigestS
2590: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
25a0: 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 (DigestState *)
25b0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 clientData;..
25c0: 20 20 2f 2a 20 43 61 6e 63 65 6c 20 61 63 74 69 /* Cancel acti
25d0: 76 65 20 74 69 6d 65 72 2c 20 69 66 20 61 6e 79 ve timer, if any
25e0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 */. if (stat
25f0: 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 ePtr->timer != (
2600: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 Tcl_TimerToken)
2610: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c NULL) {..Tcl_Del
2620: 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 eteTimerHandler(
2630: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 statePtr->timer)
2640: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d ;..statePtr->tim
2650: 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 er = (Tcl_TimerT
2660: 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 oken) NULL;.
2670: 7d 0a 0a 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 }.. /* Output
2680: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 message digest
2690: 69 66 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 64 if not already d
26a0: 6f 6e 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 one */. if (!
26b0: 28 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 (statePtr->flags
26c0: 20 26 20 43 48 41 4e 5f 45 4f 46 29 29 20 7b 0a & CHAN_EOF)) {.
26d0: 09 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72 .Tcl_Channel par
26e0: 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 ent = Tcl_GetSta
26f0: 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 ckedChannel(stat
2700: 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 09 54 63 ePtr->self);..Tc
2710: 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a l_Obj *resultObj
2720: 3b 0a 09 69 6e 74 20 77 72 69 74 74 65 6e 3b 0a ;..int written;.
2730: 0a 09 69 66 20 28 44 69 67 65 73 74 46 69 6e 61 ..if (DigestFina
2740: 6c 69 7a 65 28 73 74 61 74 65 50 74 72 2d 3e 69 lize(statePtr->i
2750: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c nterp, statePtr,
2760: 20 26 72 65 73 75 6c 74 4f 62 6a 29 20 3d 3d 20 &resultObj) ==
2770: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 75 TCL_OK) {.. u
2780: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 nsigned char *da
2790: 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 ta = Tcl_GetByte
27a0: 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 72 65 73 ArrayFromObj(res
27b0: 75 6c 74 4f 62 6a 2c 20 26 77 72 69 74 74 65 6e ultObj, &written
27c0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 57 72 69 74 );.. Tcl_Writ
27d0: 65 52 61 77 28 70 61 72 65 6e 74 2c 20 64 61 74 eRaw(parent, dat
27e0: 61 2c 20 77 72 69 74 74 65 6e 29 3b 0a 09 20 20 a, written);..
27f0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
2800: 6e 74 28 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 09 nt(resultObj);..
2810: 7d 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 }..statePtr->fla
2820: 67 73 20 7c 3d 20 43 48 41 4e 5f 45 4f 46 3b 0a gs |= CHAN_EOF;.
2830: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c }.. /* Cl
2840: 65 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 20 44 69 ean-up */. Di
2850: 67 65 73 74 53 74 61 74 65 46 72 65 65 28 73 74 gestStateFree(st
2860: 61 74 65 50 74 72 29 3b 0a 20 20 20 20 72 65 74 atePtr);. ret
2870: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 urn 0;.}../*. *
2880: 53 61 6d 65 20 61 73 20 44 69 67 65 73 74 43 6c Same as DigestCl
2890: 6f 73 65 50 72 6f 63 20 62 75 74 20 77 69 74 68 oseProc but with
28a0: 20 69 6e 64 69 76 69 64 75 61 6c 20 72 65 61 64 individual read
28b0: 20 61 6e 64 20 77 72 69 74 65 20 63 6c 6f 73 65 and write close
28c0: 20 63 6f 6e 74 72 6f 6c 0a 20 2a 2f 0a 73 74 61 control. */.sta
28d0: 74 69 63 20 69 6e 74 20 44 69 67 65 73 74 43 6c tic int DigestCl
28e0: 6f 73 65 32 50 72 6f 63 28 43 6c 69 65 6e 74 44 ose2Proc(ClientD
28f0: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61 ata instanceData
2900: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
2910: 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 terp, int flags)
2920: 20 7b 0a 0a 20 20 20 20 69 66 20 28 28 66 6c 61 {.. if ((fla
2930: 67 73 20 26 20 28 54 43 4c 5f 43 4c 4f 53 45 5f gs & (TCL_CLOSE_
2940: 52 45 41 44 20 7c 20 54 43 4c 5f 43 4c 4f 53 45 READ | TCL_CLOSE
2950: 5f 57 52 49 54 45 29 29 20 3d 3d 20 30 29 20 7b _WRITE)) == 0) {
2960: 0a 09 72 65 74 75 72 6e 20 44 69 67 65 73 74 43 ..return DigestC
2970: 6c 6f 73 65 50 72 6f 63 28 69 6e 73 74 61 6e 63 loseProc(instanc
2980: 65 44 61 74 61 2c 20 69 6e 74 65 72 70 29 3b 0a eData, interp);.
2990: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
29a0: 20 45 49 4e 56 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 20 EINVAL;.}../*.
29b0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
29c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
29d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
29e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
29f0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 -------. *. * Di
2a00: 67 65 73 74 49 6e 70 75 74 50 72 6f 63 20 2d 2d gestInputProc --
2a10: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 . *. *.Called by
2a20: 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 the generic IO
2a30: 73 79 73 74 65 6d 20 74 6f 20 72 65 61 64 20 64 system to read d
2a40: 61 74 61 20 66 72 6f 6d 20 74 72 61 6e 73 66 6f ata from transfo
2a50: 72 6d 20 61 6e 64 0a 20 2a 09 70 6c 61 63 65 20 rm and. *.place
2a60: 69 6e 20 62 75 66 2e 20 54 72 61 6e 73 66 6f 72 in buf. Transfor
2a70: 6d 20 67 65 74 73 20 64 61 74 61 20 66 72 6f 6d m gets data from
2a80: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 the underlying
2a90: 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 channel.. *. * R
2aa0: 65 74 75 72 6e 73 3a 0a 20 2a 09 54 6f 74 61 6c eturns:. *.Total
2ab0: 20 62 79 74 65 73 20 72 65 61 64 20 6f 72 20 2d bytes read or -
2ac0: 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 20 61 1 for an error a
2ad0: 6c 6f 6e 67 20 77 69 74 68 20 61 20 50 4f 53 49 long with a POSI
2ae0: 58 20 65 72 72 6f 72 0a 20 2a 09 63 6f 64 65 20 X error. *.code
2af0: 69 6e 20 65 72 72 6f 72 43 6f 64 65 50 74 72 2e in errorCodePtr.
2b00: 20 55 73 65 20 45 41 47 41 49 4e 20 66 6f 72 20 Use EAGAIN for
2b10: 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 20 nonblocking and
2b20: 6e 6f 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 20 53 no data.. *. * S
2b30: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
2b40: 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 74 Read data from t
2b50: 72 61 6e 73 66 6f 72 6d 20 61 6e 64 20 77 72 69 ransform and wri
2b60: 74 65 20 74 6f 20 62 75 66 0a 20 2a 0a 20 2a 2d te to buf. *. *-
2b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2bb0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 -----. */.int Di
2bc0: 67 65 73 74 49 6e 70 75 74 50 72 6f 63 28 43 6c gestInputProc(Cl
2bd0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
2be0: 61 74 61 2c 20 63 68 61 72 20 2a 62 75 66 2c 20 ata, char *buf,
2bf0: 69 6e 74 20 74 6f 52 65 61 64 2c 20 69 6e 74 20 int toRead, int
2c00: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 20 7b *errorCodePtr) {
2c10: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 . DigestState
2c20: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 *statePtr = (Di
2c30: 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 gestState *) cli
2c40: 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c entData;. Tcl
2c50: 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b _Channel parent;
2c60: 0a 20 20 20 20 69 6e 74 20 72 65 61 64 3b 0a 20 . int read;.
2c70: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 *errorCodePtr
2c80: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 = 0;.. /* Ab
2c90: 6f 72 74 20 69 66 20 6e 6f 74 68 69 6e 67 20 74 ort if nothing t
2ca0: 6f 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 20 o process */.
2cb0: 20 69 66 20 28 74 6f 52 65 61 64 20 3c 3d 20 30 if (toRead <= 0
2cc0: 20 7c 7c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 || statePtr->se
2cd0: 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e lf == (Tcl_Chann
2ce0: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 el) NULL) {..ret
2cf0: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 urn 0;. }..
2d00: 20 20 2f 2a 20 47 65 74 20 62 79 74 65 73 20 66 /* Get bytes f
2d10: 72 6f 6d 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 rom underlying c
2d20: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 70 61 hannel */. pa
2d30: 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 rent = Tcl_GetSt
2d40: 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 ackedChannel(sta
2d50: 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 tePtr->self);.
2d60: 20 20 72 65 61 64 20 3d 20 54 63 6c 5f 52 65 61 read = Tcl_Rea
2d70: 64 52 61 77 28 70 61 72 65 6e 74 2c 20 62 75 66 dRaw(parent, buf
2d80: 2c 20 74 6f 52 65 61 64 29 3b 0a 0a 20 20 20 20 , toRead);..
2d90: 2f 2a 20 55 70 64 61 74 65 20 68 61 73 68 20 66 /* Update hash f
2da0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 unction */. i
2db0: 66 20 28 72 65 61 64 20 3e 20 30 29 20 7b 0a 09 f (read > 0) {..
2dc0: 2f 2a 20 48 61 76 65 20 64 61 74 61 20 2a 2f 0a /* Have data */.
2dd0: 09 69 66 20 28 44 69 67 65 73 74 55 70 64 61 74 .if (DigestUpdat
2de0: 65 28 73 74 61 74 65 50 74 72 2c 20 62 75 66 2c e(statePtr, buf,
2df0: 20 28 73 69 7a 65 5f 74 29 20 72 65 61 64 2c 20 (size_t) read,
2e00: 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 0) != TCL_OK) {.
2e10: 09 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
2e20: 6e 65 6c 45 72 72 6f 72 28 73 74 61 74 65 50 74 nelError(statePt
2e30: 72 2d 3e 73 65 6c 66 2c 20 54 63 6c 5f 4f 62 6a r->self, Tcl_Obj
2e40: 50 72 69 6e 74 66 28 22 55 70 64 61 74 65 20 66 Printf("Update f
2e50: 61 69 6c 65 64 3a 20 25 73 22 2c 20 52 45 41 53 ailed: %s", REAS
2e60: 4f 4e 28 29 29 29 3b 0a 09 20 20 20 20 2a 65 72 ON()));.. *er
2e70: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4e rorCodePtr = EIN
2e80: 56 41 4c 3b 0a 09 20 20 20 20 72 65 74 75 72 6e VAL;.. return
2e90: 20 30 3b 0a 09 7d 0a 09 2f 2a 20 54 68 69 73 20 0;..}../* This
2ea0: 69 73 20 63 6f 72 72 65 63 74 20 2a 2f 0a 09 72 is correct */..r
2eb0: 65 61 64 20 3d 20 2d 31 3b 0a 09 2a 65 72 72 6f ead = -1;..*erro
2ec0: 72 43 6f 64 65 50 74 72 20 3d 20 45 41 47 41 49 rCodePtr = EAGAI
2ed0: 4e 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 N;.. } else i
2ee0: 66 20 28 72 65 61 64 20 3c 20 30 29 20 7b 0a 09 f (read < 0) {..
2ef0: 2f 2a 20 45 72 72 6f 72 20 2a 2f 0a 09 2a 65 72 /* Error */..*er
2f00: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 54 63 6c rorCodePtr = Tcl
2f10: 5f 47 65 74 45 72 72 6e 6f 28 29 3b 0a 0a 20 20 _GetErrno();..
2f20: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 21 28 73 } else if (!(s
2f30: 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 tatePtr->flags &
2f40: 20 43 48 41 4e 5f 45 4f 46 29 29 20 7b 0a 09 2f CHAN_EOF)) {../
2f50: 2a 20 45 4f 46 20 2a 2f 0a 09 54 63 6c 5f 4f 62 * EOF */..Tcl_Ob
2f60: 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 3b 0a 09 69 j *resultObj;..i
2f70: 66 20 28 44 69 67 65 73 74 46 69 6e 61 6c 69 7a f (DigestFinaliz
2f80: 65 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 e(statePtr->inte
2f90: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 26 72 rp, statePtr, &r
2fa0: 65 73 75 6c 74 4f 62 6a 29 20 3d 3d 20 54 43 4c esultObj) == TCL
2fb0: 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 75 6e 73 69 _OK) {.. unsi
2fc0: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 20 gned char *data
2fd0: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 = Tcl_GetByteArr
2fe0: 61 79 46 72 6f 6d 4f 62 6a 28 72 65 73 75 6c 74 ayFromObj(result
2ff0: 4f 62 6a 2c 20 26 72 65 61 64 29 3b 0a 09 20 20 Obj, &read);..
3000: 20 20 6d 65 6d 63 70 79 28 62 75 66 2c 20 64 61 memcpy(buf, da
3010: 74 61 2c 20 72 65 61 64 29 3b 0a 09 20 20 20 20 ta, read);..
3020: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
3030: 28 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 0a 09 7d (resultObj);...}
3040: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c else {.. Tcl
3050: 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72 _SetChannelError
3060: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c (statePtr->self,
3070: 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22 Tcl_ObjPrintf("
3080: 46 69 6e 61 6c 69 7a 65 20 66 61 69 6c 65 64 3a Finalize failed:
3090: 20 25 73 22 2c 20 52 45 41 53 4f 4e 28 29 29 29 %s", REASON()))
30a0: 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 ;.. *errorCod
30b0: 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 ePtr = EINVAL;..
30c0: 20 20 20 20 72 65 61 64 20 3d 20 30 3b 0a 09 7d read = 0;..}
30d0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 ..statePtr->flag
30e0: 73 20 7c 3d 20 43 48 41 4e 5f 45 4f 46 3b 0a 20 s |= CHAN_EOF;.
30f0: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
3100: 72 65 61 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d read;.}../*. *--
3110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3150: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 ----. *. * Diges
3160: 74 4f 75 74 70 75 74 50 72 6f 63 20 2d 2d 0a 20 tOutputProc --.
3170: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 *. *.Called by t
3180: 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 73 79 he generic IO sy
3190: 73 74 65 6d 20 74 6f 20 77 72 69 74 65 20 64 61 stem to write da
31a0: 74 61 20 69 6e 20 62 75 66 20 74 6f 20 74 72 61 ta in buf to tra
31b0: 6e 73 66 6f 72 6d 2e 0a 20 2a 09 54 68 65 20 74 nsform.. *.The t
31c0: 72 61 6e 73 66 6f 72 6d 20 77 72 69 74 65 73 20 ransform writes
31d0: 74 68 65 20 72 65 73 75 6c 74 20 74 6f 20 74 68 the result to th
31e0: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 e underlying cha
31f0: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 nnel.. *. * Retu
3200: 72 6e 73 3a 0a 20 2a 09 54 6f 74 61 6c 20 62 79 rns:. *.Total by
3210: 74 65 73 20 77 72 69 74 74 65 6e 20 6f 72 20 2d tes written or -
3220: 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 20 61 1 for an error a
3230: 6c 6f 6e 67 20 77 69 74 68 20 61 20 50 4f 53 49 long with a POSI
3240: 58 20 65 72 72 6f 72 0a 20 2a 09 63 6f 64 65 20 X error. *.code
3250: 69 6e 20 65 72 72 6f 72 43 6f 64 65 50 74 72 2e in errorCodePtr.
3260: 20 55 73 65 20 45 41 47 41 49 4e 20 66 6f 72 20 Use EAGAIN for
3270: 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 20 nonblocking and
3280: 63 61 6e 27 74 20 77 72 69 74 65 20 64 61 74 61 can't write data
3290: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
32a0: 65 63 74 73 3a 0a 20 2a 09 47 65 74 20 64 61 74 ects:. *.Get dat
32b0: 61 20 66 72 6f 6d 20 62 75 66 20 61 6e 64 20 75 a from buf and u
32c0: 70 64 61 74 65 20 64 69 67 65 73 74 0a 20 2a 0a pdate digest. *.
32d0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
32e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
32f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3310: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 20 69 6e --------. */. in
3320: 74 20 44 69 67 65 73 74 4f 75 74 70 75 74 50 72 t DigestOutputPr
3330: 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c oc(ClientData cl
3340: 69 65 6e 74 44 61 74 61 2c 20 63 6f 6e 73 74 20 ientData, const
3350: 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 74 char *buf, int t
3360: 6f 57 72 69 74 65 2c 20 69 6e 74 20 2a 65 72 72 oWrite, int *err
3370: 6f 72 43 6f 64 65 50 74 72 29 20 7b 0a 20 20 20 orCodePtr) {.
3380: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 DigestState *st
3390: 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 atePtr = (Digest
33a0: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 State *) clientD
33b0: 61 74 61 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 ata;. *errorC
33c0: 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 odePtr = 0;..
33d0: 20 2f 2a 20 41 62 6f 72 74 20 69 66 20 6e 6f 74 /* Abort if not
33e0: 68 69 6e 67 20 74 6f 20 70 72 6f 63 65 73 73 20 hing to process
33f0: 2a 2f 0a 20 20 20 20 69 66 20 28 74 6f 57 72 69 */. if (toWri
3400: 74 65 20 3c 3d 20 30 20 7c 7c 20 73 74 61 74 65 te <= 0 || state
3410: 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 Ptr->self == (Tc
3420: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
3430: 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 {..return 0;.
3440: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 }.. /* Upda
3450: 74 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e te hash function
3460: 20 2a 2f 0a 20 20 20 20 69 66 20 28 44 69 67 65 */. if (Dige
3470: 73 74 55 70 64 61 74 65 28 73 74 61 74 65 50 74 stUpdate(statePt
3480: 72 2c 20 62 75 66 2c 20 28 73 69 7a 65 5f 74 29 r, buf, (size_t)
3490: 20 74 6f 57 72 69 74 65 2c 20 30 29 20 21 3d 20 toWrite, 0) !=
34a0: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 53 TCL_OK) {..Tcl_S
34b0: 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72 28 73 etChannelError(s
34c0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 54 tatePtr->self, T
34d0: 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22 55 70 cl_ObjPrintf("Up
34e0: 64 61 74 65 20 66 61 69 6c 65 64 3a 20 25 73 22 date failed: %s"
34f0: 2c 20 52 45 41 53 4f 4e 28 29 29 29 3b 0a 09 2a , REASON()));..*
3500: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 errorCodePtr = E
3510: 49 4e 56 41 4c 3b 0a 09 72 65 74 75 72 6e 20 30 INVAL;..return 0
3520: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 ;. }. retu
3530: 72 6e 20 74 6f 57 72 69 74 65 3b 0a 7d 0a 0a 2f rn toWrite;.}../
3540: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
3550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
3590: 20 44 69 67 65 73 74 53 65 74 4f 70 74 69 6f 6e DigestSetOption
35a0: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 Proc --. *. *.Ca
35b0: 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 lled by the gene
35c0: 72 69 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f ric IO system to
35d0: 20 73 65 74 20 63 68 61 6e 6e 65 6c 20 6f 70 74 set channel opt
35e0: 69 6f 6e 20 6e 61 6d 65 20 74 6f 20 76 61 6c 75 ion name to valu
35f0: 65 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 e.. *. * Returns
3600: 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 73 :. *.TCL_OK if s
3610: 75 63 63 65 73 73 66 75 6c 20 6f 72 20 54 43 4c uccessful or TCL
3620: 5f 45 52 52 4f 52 20 69 66 20 66 61 69 6c 65 64 _ERROR if failed
3630: 20 61 6c 6f 6e 67 20 77 69 74 68 20 61 6e 20 65 along with an e
3640: 72 72 6f 72 0a 20 2a 09 6d 65 73 73 61 67 65 20 rror. *.message
3650: 69 6e 20 69 6e 74 65 72 70 20 61 6e 64 20 54 63 in interp and Tc
3660: 6c 5f 53 65 74 45 72 72 6e 6f 2e 0a 20 2a 0a 20 l_SetErrno.. *.
3670: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
3680: 20 2a 09 55 70 64 61 74 65 73 20 63 68 61 6e 6e *.Updates chann
3690: 65 6c 20 6f 70 74 69 6f 6e 20 74 6f 20 6e 65 77 el option to new
36a0: 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d value.. *. *---
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36f0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
3700: 6e 74 20 44 69 67 65 73 74 53 65 74 4f 70 74 69 nt DigestSetOpti
3710: 6f 6e 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 onProc(ClientDat
3720: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
3730: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
3740: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 , const char *op
3750: 74 69 6f 6e 4e 61 6d 65 2c 0a 09 63 6f 6e 73 74 tionName,..const
3760: 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 56 61 6c char *optionVal
3770: 75 65 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 ue) {. Digest
3780: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
3790: 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a = (DigestState *
37a0: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 ) clientData;.
37b0: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 Tcl_Channel pa
37c0: 72 65 6e 74 3b 0a 20 20 20 20 54 63 6c 5f 44 72 rent;. Tcl_Dr
37d0: 69 76 65 72 53 65 74 4f 70 74 69 6f 6e 50 72 6f iverSetOptionPro
37e0: 63 20 2a 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 c *setOptionProc
37f0: 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 ;.. /* Abort
3800: 69 66 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f if no channel */
3810: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
3820: 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f r->self == (Tcl_
3830: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
3840: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
3850: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
3860: 2a 20 44 65 6c 65 67 61 74 65 20 6f 70 74 69 6f * Delegate optio
3870: 6e 73 20 64 6f 77 6e 73 74 72 65 61 6d 20 2a 2f ns downstream */
3880: 0a 20 20 20 20 70 61 72 65 6e 74 20 3d 20 54 63 . parent = Tc
3890: 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e l_GetStackedChan
38a0: 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 nel(statePtr->se
38b0: 6c 66 29 3b 0a 20 20 20 20 73 65 74 4f 70 74 69 lf);. setOpti
38c0: 6f 6e 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 onProc = Tcl_Cha
38d0: 6e 6e 65 6c 53 65 74 4f 70 74 69 6f 6e 50 72 6f nnelSetOptionPro
38e0: 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c c(Tcl_GetChannel
38f0: 54 79 70 65 28 70 61 72 65 6e 74 29 29 3b 0a 20 Type(parent));.
3900: 20 20 20 69 66 20 28 73 65 74 4f 70 74 69 6f 6e if (setOption
3910: 50 72 6f 63 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a Proc != NULL) {.
3920: 09 72 65 74 75 72 6e 20 28 2a 73 65 74 4f 70 74 .return (*setOpt
3930: 69 6f 6e 50 72 6f 63 29 28 54 63 6c 5f 47 65 74 ionProc)(Tcl_Get
3940: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 ChannelInstanceD
3950: 61 74 61 28 70 61 72 65 6e 74 29 2c 20 69 6e 74 ata(parent), int
3960: 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c erp, optionName,
3970: 20 6f 70 74 69 6f 6e 56 61 6c 75 65 29 3b 0a 20 optionValue);.
3980: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c } else {..Tcl
3990: 5f 53 65 74 45 72 72 6e 6f 28 45 49 4e 56 41 4c _SetErrno(EINVAL
39a0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 63 6c 5f 42 );..return Tcl_B
39b0: 61 64 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 adChannelOption(
39c0: 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 interp, optionNa
39d0: 6d 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d me, NULL);. }
39e0: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
39f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
3a30: 20 2a 0a 20 2a 20 44 69 67 65 73 74 47 65 74 4f *. * DigestGetO
3a40: 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a ptionProc --. *.
3a50: 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65 *.Called by the
3a60: 20 67 65 6e 65 72 69 63 20 49 4f 20 73 79 73 74 generic IO syst
3a70: 65 6d 20 74 6f 20 67 65 74 20 63 68 61 6e 6e 65 em to get channe
3a80: 6c 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 27 73 20 l option name's
3a90: 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a 20 52 65 74 value.. *. * Ret
3aa0: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 urns:. *.TCL_OK
3ab0: 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 if successful or
3ac0: 20 54 43 4c 5f 45 52 52 4f 52 20 69 66 20 66 61 TCL_ERROR if fa
3ad0: 69 6c 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 iled along with
3ae0: 61 6e 20 65 72 72 6f 72 0a 20 2a 09 6d 65 73 73 an error. *.mess
3af0: 61 67 65 20 69 6e 20 69 6e 74 65 72 70 20 61 6e age in interp an
3b00: 64 20 54 63 6c 5f 53 65 74 45 72 72 6e 6f 2e 0a d Tcl_SetErrno..
3b10: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
3b20: 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75 ts:. *.Sets resu
3b30: 6c 74 20 74 6f 20 6f 70 74 69 6f 6e 27 73 20 76 lt to option's v
3b40: 61 6c 75 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d alue. *. *------
3b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b90: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 . */.static int
3ba0: 44 69 67 65 73 74 47 65 74 4f 70 74 69 6f 6e 50 DigestGetOptionP
3bb0: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 roc(ClientData c
3bc0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
3bd0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 nterp *interp, c
3be0: 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69 6f onst char *optio
3bf0: 6e 4e 61 6d 65 2c 0a 09 54 63 6c 5f 44 53 74 72 nName,..Tcl_DStr
3c00: 69 6e 67 20 2a 6f 70 74 69 6f 6e 56 61 6c 75 65 ing *optionValue
3c10: 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 ) {. DigestSt
3c20: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
3c30: 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 (DigestState *)
3c40: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 clientData;.
3c50: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 Tcl_Channel pare
3c60: 6e 74 3b 0a 20 20 20 20 54 63 6c 5f 44 72 69 76 nt;. Tcl_Driv
3c70: 65 72 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 erGetOptionProc
3c80: 2a 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 3b 0a *getOptionProc;.
3c90: 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 . /* Abort if
3ca0: 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 no channel */.
3cb0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
3cc0: 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 >self == (Tcl_Ch
3cd0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
3ce0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
3cf0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
3d00: 44 65 6c 65 67 61 74 65 20 6f 70 74 69 6f 6e 73 Delegate options
3d10: 20 64 6f 77 6e 73 74 72 65 61 6d 20 2a 2f 0a 20 downstream */.
3d20: 20 20 20 70 61 72 65 6e 74 20 3d 20 54 63 6c 5f parent = Tcl_
3d30: 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 GetStackedChanne
3d40: 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 l(statePtr->self
3d50: 29 3b 0a 20 20 20 20 67 65 74 4f 70 74 69 6f 6e );. getOption
3d60: 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e 6e Proc = Tcl_Chann
3d70: 65 6c 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 elGetOptionProc(
3d80: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 Tcl_GetChannelTy
3d90: 70 65 28 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 pe(parent));.
3da0: 20 69 66 20 28 67 65 74 4f 70 74 69 6f 6e 50 72 if (getOptionPr
3db0: 6f 63 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 oc != NULL) {..r
3dc0: 65 74 75 72 6e 20 28 2a 67 65 74 4f 70 74 69 6f eturn (*getOptio
3dd0: 6e 50 72 6f 63 29 28 54 63 6c 5f 47 65 74 43 68 nProc)(Tcl_GetCh
3de0: 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 annelInstanceDat
3df0: 61 28 70 61 72 65 6e 74 29 2c 20 69 6e 74 65 72 a(parent), inter
3e00: 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 6f p, optionName, o
3e10: 70 74 69 6f 6e 56 61 6c 75 65 29 3b 0a 20 20 20 ptionValue);.
3e20: 20 7d 20 65 6c 73 65 20 69 66 20 28 6f 70 74 69 } else if (opti
3e30: 6f 6e 4e 61 6d 65 20 3d 3d 20 28 63 68 61 72 2a onName == (char*
3e40: 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 52 65 ) NULL) {../* Re
3e50: 71 75 65 73 74 20 69 73 20 71 75 65 72 79 20 66 quest is query f
3e60: 6f 72 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 2c 20 or all options,
3e70: 74 68 69 73 20 69 73 20 6f 6b 2e 20 2a 2f 0a 09 this is ok. */..
3e80: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 return TCL_OK;.
3e90: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c } else {..Tcl
3ea0: 5f 53 65 74 45 72 72 6e 6f 28 45 49 4e 56 41 4c _SetErrno(EINVAL
3eb0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 63 6c 5f 42 );..return Tcl_B
3ec0: 61 64 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 adChannelOption(
3ed0: 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 interp, optionNa
3ee0: 6d 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d me, NULL);. }
3ef0: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
3f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
3f40: 20 2a 0a 20 2a 20 44 69 67 65 73 74 54 69 6d 65 *. * DigestTime
3f50: 72 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 rHandler --. *.
3f60: 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20 *.Called by the
3f70: 6e 6f 74 69 66 69 65 72 20 76 69 61 20 74 69 6d notifier via tim
3f80: 65 72 20 74 6f 20 66 6c 75 73 68 20 6f 75 74 20 er to flush out
3f90: 70 65 6e 64 69 6e 67 20 69 6e 70 75 74 20 64 61 pending input da
3fa0: 74 61 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e ta.. *. * Return
3fb0: 73 3a 0a 20 2a 09 4e 6f 74 68 69 6e 67 0a 20 2a s:. *.Nothing. *
3fc0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
3fd0: 3a 0a 20 2a 09 4d 61 79 20 63 61 6c 6c 20 54 63 :. *.May call Tc
3fe0: 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c 0a l_NotifyChannel.
3ff0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
4000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
4040: 73 74 61 74 69 63 20 76 6f 69 64 20 44 69 67 65 static void Dige
4050: 73 74 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 43 stTimerHandler(C
4060: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
4070: 44 61 74 61 29 20 7b 0a 20 20 20 20 44 69 67 65 Data) {. Dige
4080: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 stState *statePt
4090: 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 r = (DigestState
40a0: 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a *) clientData;.
40b0: 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 . /* Abort if
40c0: 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 no channel */.
40d0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
40e0: 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 >self == (Tcl_Ch
40f0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
4100: 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 return;. }..
4110: 20 20 20 2f 2a 20 43 6c 65 61 72 20 74 69 6d 65 /* Clear time
4120: 72 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 73 r token */. s
4130: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d tatePtr->timer =
4140: 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e (Tcl_TimerToken
4150: 29 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 ) NULL;.. /*
4160: 46 69 72 65 20 65 76 65 6e 74 20 69 66 20 74 68 Fire event if th
4170: 65 72 65 20 69 73 20 70 65 6e 64 69 6e 67 20 64 ere is pending d
4180: 61 74 61 2c 20 73 6b 69 70 20 6f 74 68 65 72 77 ata, skip otherw
4190: 69 73 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 ise */. if ((
41a0: 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d statePtr->watchM
41b0: 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 41 42 ask & TCL_READAB
41c0: 4c 45 29 20 26 26 20 28 54 63 6c 5f 49 6e 70 75 LE) && (Tcl_Inpu
41d0: 74 42 75 66 66 65 72 65 64 28 73 74 61 74 65 50 tBuffered(stateP
41e0: 74 72 2d 3e 73 65 6c 66 29 20 3e 20 30 29 29 20 tr->self) > 0))
41f0: 7b 0a 09 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 {..Tcl_NotifyCha
4200: 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 nnel(statePtr->s
4210: 65 6c 66 2c 20 54 43 4c 5f 52 45 41 44 41 42 4c elf, TCL_READABL
4220: 45 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a E);. }.}../*.
4230: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
4240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4270: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 --------. *. * D
4280: 69 67 65 73 74 57 61 74 63 68 50 72 6f 63 20 2d igestWatchProc -
4290: 2d 0a 20 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 -. *. *.Initiali
42a0: 7a 65 20 74 68 65 20 6e 6f 74 69 66 69 65 72 20 ze the notifier
42b0: 74 6f 20 77 61 74 63 68 20 66 6f 72 20 65 76 65 to watch for eve
42c0: 6e 74 73 20 66 72 6f 6d 20 74 68 69 73 20 63 68 nts from this ch
42d0: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 74 annel.. *. * Ret
42e0: 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74 68 69 6e 67 urns:. *.Nothing
42f0: 20 28 63 61 6e 27 74 20 72 65 74 75 72 6e 20 65 (can't return e
4300: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 29 0a 20 rror messages).
4310: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
4320: 73 3a 0a 20 2a 09 43 6f 6e 66 69 67 75 72 65 20 s:. *.Configure
4330: 6e 6f 74 69 66 69 65 72 20 73 6f 20 66 75 74 75 notifier so futu
4340: 72 65 20 65 76 65 6e 74 73 20 6f 6e 20 74 68 65 re events on the
4350: 20 63 68 61 6e 6e 65 6c 20 77 69 6c 6c 20 62 65 channel will be
4360: 20 73 65 65 6e 20 62 79 20 54 63 6c 2e 0a 20 2a seen by Tcl.. *
4370: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
43b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f ---------. */.vo
43c0: 69 64 20 44 69 67 65 73 74 57 61 74 63 68 50 72 id DigestWatchPr
43d0: 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c oc(ClientData cl
43e0: 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 20 6d 61 ientData, int ma
43f0: 73 6b 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 sk) {. Digest
4400: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
4410: 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a = (DigestState *
4420: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 ) clientData;.
4430: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 Tcl_Channel pa
4440: 72 65 6e 74 3b 0a 20 20 20 20 54 63 6c 5f 44 72 rent;. Tcl_Dr
4450: 69 76 65 72 57 61 74 63 68 50 72 6f 63 20 2a 77 iverWatchProc *w
4460: 61 74 63 68 50 72 6f 63 3b 0a 0a 20 20 20 20 2f atchProc;.. /
4470: 2a 20 41 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 * Abort if no ch
4480: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 annel */. if
4490: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 (statePtr->self
44a0: 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 == (Tcl_Channel)
44b0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
44c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
44d0: 53 74 6f 72 65 20 4f 52 2d 65 64 20 63 6f 6d 62 Store OR-ed comb
44e0: 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 ination of TCL_R
44f0: 45 41 44 41 42 4c 45 2c 20 54 43 4c 5f 57 52 49 EADABLE, TCL_WRI
4500: 54 41 42 4c 45 20 61 6e 64 20 54 43 4c 5f 45 58 TABLE and TCL_EX
4510: 43 45 50 54 49 4f 4e 20 2a 2f 0a 20 20 20 20 73 CEPTION */. s
4520: 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 tatePtr->watchMa
4530: 73 6b 20 3d 20 6d 61 73 6b 3b 0a 0a 20 20 20 20 sk = mask;..
4540: 2f 2a 20 50 72 6f 70 61 67 61 74 65 20 6d 61 73 /* Propagate mas
4550: 6b 20 69 6e 66 6f 20 74 6f 20 70 61 72 65 6e 74 k info to parent
4560: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
4570: 70 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 parent = Tcl_Get
4580: 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 StackedChannel(s
4590: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a tatePtr->self);.
45a0: 20 20 20 20 77 61 74 63 68 50 72 6f 63 20 3d 20 watchProc =
45b0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 57 61 74 63 68 Tcl_ChannelWatch
45c0: 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e Proc(Tcl_GetChan
45d0: 6e 65 6c 54 79 70 65 28 70 61 72 65 6e 74 29 29 nelType(parent))
45e0: 3b 0a 20 20 20 20 77 61 74 63 68 50 72 6f 63 28 ;. watchProc(
45f0: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e Tcl_GetChannelIn
4600: 73 74 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e stanceData(paren
4610: 74 29 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20 20 20 t), mask);..
4620: 2f 2a 20 52 65 6d 6f 76 65 20 70 65 6e 64 69 6e /* Remove pendin
4630: 67 20 74 69 6d 65 72 20 2a 2f 0a 20 20 20 20 69 g timer */. i
4640: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d f (statePtr->tim
4650: 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 er != (Tcl_Timer
4660: 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 Token) NULL) {..
4670: 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 Tcl_DeleteTimerH
4680: 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d andler(statePtr-
4690: 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 >timer);..stateP
46a0: 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c tr->timer = (Tcl
46b0: 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c _TimerToken) NUL
46c0: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a L;. }.. /*
46d0: 20 49 66 20 74 68 65 72 65 20 69 73 20 64 61 74 If there is dat
46e0: 61 20 70 65 6e 64 69 6e 67 2c 20 73 65 74 20 6e a pending, set n
46f0: 65 77 20 74 69 6d 65 72 20 74 6f 20 63 61 6c 6c ew timer to call
4700: 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e Tcl_NotifyChann
4710: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 6d el */. if ((m
4720: 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 41 42 ask & TCL_READAB
4730: 4c 45 29 20 26 26 20 28 54 63 6c 5f 49 6e 70 75 LE) && (Tcl_Inpu
4740: 74 42 75 66 66 65 72 65 64 28 73 74 61 74 65 50 tBuffered(stateP
4750: 74 72 2d 3e 73 65 6c 66 29 20 3e 20 30 29 29 20 tr->self) > 0))
4760: 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d {..statePtr->tim
4770: 65 72 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 54 er = Tcl_CreateT
4780: 69 6d 65 72 48 61 6e 64 6c 65 72 28 52 45 41 44 imerHandler(READ
4790: 5f 44 45 4c 41 59 2c 20 44 69 67 65 73 74 54 69 _DELAY, DigestTi
47a0: 6d 65 72 48 61 6e 64 6c 65 72 2c 20 28 43 6c 69 merHandler, (Cli
47b0: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
47c0: 72 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a r);. }.}../*.
47d0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
47e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4810: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 --------. *. * D
4820: 69 67 65 73 74 47 65 74 48 61 6e 64 6c 65 50 72 igestGetHandlePr
4830: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c oc --. *. *.Call
4840: 65 64 20 66 72 6f 6d 20 54 63 6c 5f 47 65 74 43 ed from Tcl_GetC
4850: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 20 74 6f 20 hannelHandle to
4860: 72 65 74 72 69 65 76 65 20 4f 53 20 73 70 65 63 retrieve OS spec
4870: 69 66 69 63 20 66 69 6c 65 20 68 61 6e 64 6c 65 ific file handle
4880: 0a 20 2a 09 66 72 6f 6d 20 69 6e 73 69 64 65 20 . *.from inside
4890: 74 68 69 73 20 63 68 61 6e 6e 65 6c 2e 20 4e 6f this channel. No
48a0: 74 20 75 73 65 64 20 66 6f 72 20 74 72 61 6e 73 t used for trans
48b0: 66 6f 72 6d 61 74 69 6f 6e 73 3f 0a 20 2a 0a 20 formations?. *.
48c0: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 * Returns:. *.TC
48d0: 4c 5f 4f 4b 20 66 6f 72 20 73 75 63 63 65 73 73 L_OK for success
48e0: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 66 6f or TCL_ERROR fo
48f0: 72 20 65 72 72 6f 72 20 6f 72 20 69 66 20 6e 6f r error or if no
4900: 74 20 73 75 70 70 6f 72 74 65 64 2e 20 49 66 0a t supported. If.
4910: 20 2a 09 64 69 72 65 63 74 69 6f 6e 20 69 73 20 *.direction is
4920: 54 43 4c 5f 52 45 41 44 41 42 4c 45 2c 20 73 65 TCL_READABLE, se
4930: 74 73 20 68 61 6e 64 6c 65 50 74 72 20 74 6f 20 ts handlePtr to
4940: 74 68 65 20 68 61 6e 64 6c 65 20 75 73 65 64 20 the handle used
4950: 66 6f 72 0a 20 2a 09 69 6e 70 75 74 2c 20 6f 72 for. *.input, or
4960: 20 69 66 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 if TCL_WRITABLE
4970: 20 73 65 74 73 20 74 6f 20 74 68 65 20 68 61 6e sets to the han
4980: 64 6c 65 20 75 73 65 64 20 66 6f 72 20 6f 75 74 dle used for out
4990: 70 75 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 put.. *. * Side
49a0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
49b0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
49c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
49f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
4a00: 0a 69 6e 74 20 44 69 67 65 73 74 47 65 74 48 61 .int DigestGetHa
4a10: 6e 64 6c 65 50 72 6f 63 28 43 6c 69 65 6e 74 44 ndleProc(ClientD
4a20: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
4a30: 69 6e 74 20 64 69 72 65 63 74 69 6f 6e 2c 20 43 int direction, C
4a40: 6c 69 65 6e 74 44 61 74 61 20 2a 68 61 6e 64 6c lientData *handl
4a50: 65 50 74 72 29 20 7b 0a 20 20 20 20 44 69 67 65 ePtr) {. Dige
4a60: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 stState *statePt
4a70: 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 r = (DigestState
4a80: 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a *) clientData;.
4a90: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
4aa0: 70 61 72 65 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 parent;.. /*
4ab0: 41 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61 6e Abort if no chan
4ac0: 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 nel */. if (s
4ad0: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d tatePtr->self ==
4ae0: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
4af0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
4b00: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
4b10: 0a 20 20 20 20 70 61 72 65 6e 74 20 3d 20 54 63 . parent = Tc
4b20: 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e l_GetStackedChan
4b30: 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 nel(statePtr->se
4b40: 6c 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 lf);. return
4b50: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48 61 Tcl_GetChannelHa
4b60: 6e 64 6c 65 28 70 61 72 65 6e 74 2c 20 64 69 72 ndle(parent, dir
4b70: 65 63 74 69 6f 6e 2c 20 68 61 6e 64 6c 65 50 74 ection, handlePt
4b80: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d r);.}../*. *----
4b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4bd0: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 4e --. *. * DigestN
4be0: 6f 74 69 66 79 50 72 6f 63 20 2d 2d 0a 20 2a 0a otifyProc --. *.
4bf0: 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 54 63 6c *.Called by Tcl
4c00: 20 74 6f 20 69 6e 66 6f 72 6d 20 75 73 20 6f 66 to inform us of
4c10: 20 61 63 74 69 76 69 74 79 20 6f 6e 20 74 68 65 activity on the
4c20: 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e underlying chan
4c30: 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 nel.. *. * Retur
4c40: 6e 73 3a 0a 20 2a 09 55 6e 63 68 61 6e 67 65 64 ns:. *.Unchanged
4c50: 20 69 6e 74 65 72 65 73 74 4d 61 73 6b 20 77 68 interestMask wh
4c60: 69 63 68 20 69 73 20 61 6e 20 4f 52 2d 65 64 20 ich is an OR-ed
4c70: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54 combination of T
4c80: 43 4c 5f 52 45 41 44 41 42 4c 45 20 6f 72 20 54 CL_READABLE or T
4c90: 43 4c 5f 57 52 49 54 41 42 4c 45 0a 20 2a 0a 20 CL_WRITABLE. *.
4ca0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
4cb0: 20 2a 09 43 61 6e 63 65 6c 73 20 61 6e 79 20 70 *.Cancels any p
4cc0: 65 6e 64 69 6e 67 20 74 69 6d 65 72 2e 0a 20 2a ending timer.. *
4cd0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
4ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e ---------. */.in
4d20: 74 20 44 69 67 65 73 74 4e 6f 74 69 66 79 50 72 t DigestNotifyPr
4d30: 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c oc(ClientData cl
4d40: 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 20 69 6e ientData, int in
4d50: 74 65 72 65 73 74 4d 61 73 6b 29 20 7b 0a 20 20 terestMask) {.
4d60: 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 DigestState *s
4d70: 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 tatePtr = (Diges
4d80: 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 tState *) client
4d90: 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 53 6b Data;.. /* Sk
4da0: 69 70 20 74 69 6d 65 72 20 65 76 65 6e 74 20 61 ip timer event a
4db0: 73 20 72 65 64 75 6e 64 61 6e 74 20 2a 2f 0a 20 s redundant */.
4dc0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
4dd0: 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 >timer != (Tcl_T
4de0: 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 imerToken) NULL)
4df0: 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 {..Tcl_DeleteTi
4e00: 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 merHandler(state
4e10: 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 Ptr->timer);..st
4e20: 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 atePtr->timer =
4e30: 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 (Tcl_TimerToken)
4e40: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 NULL;. }.
4e50: 20 72 65 74 75 72 6e 20 69 6e 74 65 72 65 73 74 return interest
4e60: 4d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 0a 20 Mask;.}../*. *.
4e70: 2a 20 43 68 61 6e 6e 65 6c 20 74 79 70 65 20 73 * Channel type s
4e80: 74 72 75 63 74 75 72 65 20 64 65 66 69 6e 69 74 tructure definit
4e90: 69 6f 6e 20 66 6f 72 20 64 69 67 65 73 74 20 74 ion for digest t
4ea0: 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 2e 0a ransformations..
4eb0: 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 6f *. */.static co
4ec0: 6e 73 74 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 54 nst Tcl_ChannelT
4ed0: 79 70 65 20 64 69 67 65 73 74 43 68 61 6e 6e 65 ype digestChanne
4ee0: 6c 54 79 70 65 20 3d 20 7b 0a 20 20 20 20 22 64 lType = {. "d
4ef0: 69 67 65 73 74 22 2c 09 09 09 2f 2a 20 54 79 70 igest",.../* Typ
4f00: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54 43 e name */. TC
4f10: 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 4f L_CHANNEL_VERSIO
4f20: 4e 5f 35 2c 09 2f 2a 20 76 35 20 63 68 61 6e 6e N_5,./* v5 chann
4f30: 65 6c 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 el */. Digest
4f40: 43 6c 6f 73 65 50 72 6f 63 2c 09 09 2f 2a 20 43 CloseProc,../* C
4f50: 6c 6f 73 65 20 70 72 6f 63 20 2a 2f 0a 20 20 20 lose proc */.
4f60: 20 44 69 67 65 73 74 49 6e 70 75 74 50 72 6f 63 DigestInputProc
4f70: 2c 09 09 2f 2a 20 49 6e 70 75 74 20 70 72 6f 63 ,../* Input proc
4f80: 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 4f 75 */. DigestOu
4f90: 74 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20 4f 75 tputProc,../* Ou
4fa0: 74 70 75 74 20 70 72 6f 63 20 2a 2f 0a 20 20 20 tput proc */.
4fb0: 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 53 65 65 6b NULL,.../* Seek
4fc0: 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 proc */. Dig
4fd0: 65 73 74 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 estSetOptionProc
4fe0: 2c 09 2f 2a 20 53 65 74 20 6f 70 74 69 6f 6e 20 ,./* Set option
4ff0: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 proc */. Dige
5000: 73 74 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 2c stGetOptionProc,
5010: 09 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 20 70 ./* Get option p
5020: 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 roc */. Diges
5030: 74 57 61 74 63 68 50 72 6f 63 2c 09 09 2f 2a 20 tWatchProc,../*
5040: 49 6e 69 74 69 61 6c 69 7a 65 20 6e 6f 74 69 66 Initialize notif
5050: 69 65 72 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 ier */. Diges
5060: 74 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 2c 09 tGetHandleProc,.
5070: 2f 2a 20 47 65 74 20 4f 53 20 68 61 6e 64 6c 65 /* Get OS handle
5080: 73 20 6f 75 74 20 6f 66 20 63 68 61 6e 6e 65 6c s out of channel
5090: 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 43 6c */. DigestCl
50a0: 6f 73 65 32 50 72 6f 63 2c 09 09 2f 2a 20 63 6c ose2Proc,../* cl
50b0: 6f 73 65 32 70 72 6f 63 20 2a 2f 0a 20 20 20 20 ose2proc */.
50c0: 44 69 67 65 73 74 42 6c 6f 63 6b 4d 6f 64 65 50 DigestBlockModeP
50d0: 72 6f 63 2c 09 2f 2a 20 53 65 74 20 62 6c 6f 63 roc,./* Set bloc
50e0: 6b 69 6e 67 2f 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 king/nonblocking
50f0: 20 6d 6f 64 65 2a 2f 0a 20 20 20 20 4e 55 4c 4c mode*/. NULL
5100: 2c 09 09 09 2f 2a 20 46 6c 75 73 68 20 70 72 6f ,.../* Flush pro
5110: 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 4e c */. DigestN
5120: 6f 74 69 66 79 50 72 6f 63 2c 09 09 2f 2a 20 48 otifyProc,../* H
5130: 61 6e 64 6c 69 6e 67 20 6f 66 20 65 76 65 6e 74 andling of event
5140: 73 20 62 75 62 62 6c 69 6e 67 20 75 70 20 2a 2f s bubbling up */
5150: 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 . NULL,.../*
5160: 57 69 64 65 20 73 65 65 6b 20 70 72 6f 63 20 2a Wide seek proc *
5170: 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a /. NULL,.../*
5180: 20 54 68 72 65 61 64 20 61 63 74 69 6f 6e 20 2a Thread action *
5190: 2f 0a 20 20 20 20 4e 55 4c 4c 09 09 09 2f 2a 20 /. NULL.../*
51a0: 54 72 75 6e 63 61 74 65 20 2a 2f 0a 7d 3b 0a 0a Truncate */.};..
51b0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
51c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
51d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
51e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
51f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
5200: 2a 20 44 69 67 65 73 74 43 68 61 6e 6e 65 6c 48 * DigestChannelH
5210: 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 2a 09 andler --. *. *.
5220: 43 72 65 61 74 65 20 61 20 73 74 61 63 6b 65 64 Create a stacked
5230: 20 63 68 61 6e 6e 65 6c 20 66 6f 72 20 61 20 6d channel for a m
5240: 65 73 73 61 67 65 20 64 69 67 65 73 74 20 74 72 essage digest tr
5250: 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 2a ansformation.. *
5260: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 . * Returns:. *.
5270: 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 TCL_OK or TCL_ER
5280: 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ROR. *. * Side e
5290: 66 66 65 63 74 73 3a 0a 20 2a 09 41 64 64 73 20 ffects:. *.Adds
52a0: 74 72 61 6e 73 66 6f 72 6d 20 74 6f 20 63 68 61 transform to cha
52b0: 6e 6e 65 6c 20 61 6e 64 20 73 65 74 73 20 72 65 nnel and sets re
52c0: 73 75 6c 74 20 74 6f 20 63 68 61 6e 6e 65 6c 20 sult to channel
52d0: 69 64 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 id or error mess
52e0: 61 67 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d age.. *. *------
52f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5330: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 . */.static int
5340: 44 69 67 65 73 74 43 68 61 6e 6e 65 6c 48 61 6e DigestChannelHan
5350: 64 6c 65 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 dler(Tcl_Interp
5360: 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 *interp, const c
5370: 68 61 72 20 2a 63 68 61 6e 6e 65 6c 2c 20 63 6f har *channel, co
5380: 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 2c 0a nst EVP_MD *md,.
5390: 09 63 6f 6e 73 74 20 45 56 50 5f 43 49 50 48 45 .const EVP_CIPHE
53a0: 52 20 2a 63 69 70 68 65 72 2c 20 69 6e 74 20 66 R *cipher, int f
53b0: 6f 72 6d 61 74 2c 20 54 63 6c 5f 4f 62 6a 20 2a ormat, Tcl_Obj *
53c0: 6b 65 79 4f 62 6a 2c 20 45 56 50 5f 4d 41 43 20 keyObj, EVP_MAC
53d0: 2a 6d 61 63 29 20 7b 0a 20 20 20 20 69 6e 74 20 *mac) {. int
53e0: 6d 6f 64 65 3b 20 2f 2a 20 4f 52 2d 65 64 20 63 mode; /* OR-ed c
53f0: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 ombination of TC
5400: 4c 5f 52 45 41 44 41 42 4c 45 20 61 6e 64 20 54 L_READABLE and T
5410: 43 4c 5f 57 52 49 54 41 42 4c 45 20 2a 2f 0a 20 CL_WRITABLE */.
5420: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 Tcl_Channel c
5430: 68 61 6e 3b 0a 20 20 20 20 44 69 67 65 73 74 53 han;. DigestS
5440: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a tate *statePtr;.
5450: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
5460: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 lled");.. /*
5470: 56 61 6c 69 64 61 74 65 20 61 72 67 73 20 2a 2f Validate args */
5480: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 6e 65 6c . if (channel
5490: 20 3d 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 == (const char
54a0: 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 *) NULL) {..retu
54b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
54c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 }.. /* Get
54d0: 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 channel Id */.
54e0: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
54f0: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
5500: 63 68 61 6e 6e 65 6c 2c 20 26 6d 6f 64 65 29 3b channel, &mode);
5510: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d . if (chan ==
5520: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
5530: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
5540: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
5550: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 . /* Make sur
5560: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 e to operate on
5570: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e the topmost chan
5580: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 nel */. chan
5590: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e = Tcl_GetTopChan
55a0: 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 nel(chan);..
55b0: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 20 63 68 61 /* Configure cha
55c0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 54 63 6c 5f nnel */. Tcl_
55d0: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e SetChannelOption
55e0: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 (interp, chan, "
55f0: 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 -translation", "
5600: 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 69 66 binary");. if
5610: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
5620: 42 75 66 66 65 72 53 69 7a 65 28 63 68 61 6e 29 BufferSize(chan)
5630: 20 3c 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 < EVP_MAX_MD_SI
5640: 5a 45 20 2a 20 32 29 20 7b 0a 09 54 63 6c 5f 53 ZE * 2) {..Tcl_S
5650: 65 74 43 68 61 6e 6e 65 6c 42 75 66 66 65 72 53 etChannelBufferS
5660: 69 7a 65 28 63 68 61 6e 2c 20 45 56 50 5f 4d 41 ize(chan, EVP_MA
5670: 58 5f 4d 44 5f 53 49 5a 45 20 2a 20 32 29 3b 0a X_MD_SIZE * 2);.
5680: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 }.. /* Cr
5690: 65 61 74 65 20 73 74 61 74 65 20 64 61 74 61 20 eate state data
56a0: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 structure */.
56b0: 20 69 66 20 28 28 73 74 61 74 65 50 74 72 20 3d if ((statePtr =
56c0: 20 44 69 67 65 73 74 53 74 61 74 65 4e 65 77 28 DigestStateNew(
56d0: 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74 29 29 interp, format))
56e0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c == NULL) {..Tcl
56f0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
5700: 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20 61 6c terp, "Memory al
5710: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c location error",
5720: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
5730: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
5740: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 OR;. }. st
5750: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 63 atePtr->self = c
5760: 68 61 6e 3b 0a 20 20 20 20 73 74 61 74 65 50 74 han;. statePt
5770: 72 2d 3e 6d 6f 64 65 20 3d 20 6d 6f 64 65 3b 0a r->mode = mode;.
5780: 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 . /* Initiali
5790: 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e ze hash function
57a0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 44 69 67 65 */. if (Dige
57b0: 73 74 49 6e 69 74 69 61 6c 69 7a 65 28 69 6e 74 stInitialize(int
57c0: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 6d erp, statePtr, m
57d0: 64 2c 20 63 69 70 68 65 72 2c 20 6b 65 79 4f 62 d, cipher, keyOb
57e0: 6a 2c 20 6d 61 63 29 20 21 3d 20 54 43 4c 5f 4f j, mac) != TCL_O
57f0: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c K) {..return TCL
5800: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
5810: 20 20 20 2f 2a 20 53 74 61 63 6b 20 63 68 61 6e /* Stack chan
5820: 6e 65 6c 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 nel */. state
5830: 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 63 6c 5f Ptr->self = Tcl_
5840: 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 StackChannel(int
5850: 65 72 70 2c 20 26 64 69 67 65 73 74 43 68 61 6e erp, &digestChan
5860: 6e 65 6c 54 79 70 65 2c 20 28 43 6c 69 65 6e 74 nelType, (Client
5870: 44 61 74 61 29 20 73 74 61 74 65 50 74 72 2c 20 Data) statePtr,
5880: 6d 6f 64 65 2c 20 63 68 61 6e 29 3b 0a 20 20 20 mode, chan);.
5890: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 if (statePtr->s
58a0: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e elf == (Tcl_Chan
58b0: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 44 69 nel) NULL) {..Di
58c0: 67 65 73 74 53 74 61 74 65 46 72 65 65 28 73 74 gestStateFree(st
58d0: 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e atePtr);..return
58e0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
58f0: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 72 65 }.. /* Set re
5900: 73 75 6c 74 20 74 6f 20 63 68 61 6e 6e 65 6c 20 sult to channel
5910: 49 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65 Id */. Tcl_Se
5920: 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 tResult(interp,
5930: 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 65 74 (char *) Tcl_Get
5940: 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 6e ChannelName(chan
5950: 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 ), TCL_VOLATILE)
5960: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
5970: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d _OK;.}../*. *---
5980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
59a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
59b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
59c0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 73 74 61 63 ---. *. * Unstac
59d0: 6b 20 43 68 61 6e 6e 65 6c 20 2d 2d 0a 20 2a 0a k Channel --. *.
59e0: 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e *.This function
59f0: 20 72 65 6d 6f 76 65 73 20 74 68 65 20 73 74 61 removes the sta
5a00: 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20 66 72 6f cked channel fro
5a10: 6d 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65 m the top of the
5a20: 0a 20 2a 09 63 68 61 6e 6e 65 6c 20 73 74 61 63 . *.channel stac
5a30: 6b 20 69 66 20 69 74 20 69 73 20 61 20 64 69 67 k if it is a dig
5a40: 65 73 74 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a est channel.. *.
5a50: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 * Returns:. *.T
5a60: 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 CL_OK or TCL_ERR
5a70: 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 OR. *. * Side ef
5a80: 66 65 63 74 73 3a 0a 20 2a 09 52 65 6d 6f 76 65 fects:. *.Remove
5a90: 73 20 74 72 61 6e 73 66 6f 72 6d 20 66 72 6f 6d s transform from
5aa0: 20 63 68 61 6e 6e 65 6c 20 6f 72 20 73 65 74 73 channel or sets
5ab0: 20 72 65 73 75 6c 74 20 74 6f 20 65 72 72 6f 72 result to error
5ac0: 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 2d message.. *. *-
5ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b10: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
5b20: 20 69 6e 74 20 44 69 67 65 73 74 55 6e 73 74 61 int DigestUnsta
5b30: 63 6b 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 ckObjCmd(ClientD
5b40: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
5b50: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
5b60: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
5b70: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
5b80: 76 5b 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 v[]) {. Tcl_C
5b90: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 hannel chan;.
5ba0: 20 69 6e 74 20 6d 6f 64 65 3b 20 2f 2a 20 4f 52 int mode; /* OR
5bb0: 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 -ed combination
5bc0: 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 of TCL_READABLE
5bd0: 61 6e 64 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 and TCL_WRITABLE
5be0: 20 20 2a 2f 0a 0a 20 20 20 20 64 70 72 69 6e 74 */.. dprint
5bf0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
5c00: 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72 /* Validate ar
5c10: 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 g count */. i
5c20: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a f (objc != 2) {.
5c30: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
5c40: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
5c50: 76 2c 20 22 63 68 61 6e 6e 65 6c 49 64 22 29 3b v, "channelId");
5c60: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
5c70: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
5c80: 2a 20 47 65 74 20 63 68 61 6e 6e 65 6c 20 2a 2f * Get channel */
5c90: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
5ca0: 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 GetChannel(inter
5cb0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 p, Tcl_GetString
5cc0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c FromObj(objv[1],
5cd0: 20 4e 55 4c 4c 29 2c 20 26 6d 6f 64 65 29 3b 0a NULL), &mode);.
5ce0: 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 if (chan ==
5cf0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
5d00: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
5d10: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
5d20: 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 /* Make sure
5d30: 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 to operate on t
5d40: 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e he topmost chann
5d50: 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d el */. chan =
5d60: 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e Tcl_GetTopChann
5d70: 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f el(chan);.. /
5d80: 2a 20 43 68 65 63 6b 20 69 66 20 64 69 67 65 73 * Check if diges
5d90: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 t channel */.
5da0: 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e if (Tcl_GetChan
5db0: 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d nelType(chan) !=
5dc0: 20 26 64 69 67 65 73 74 43 68 61 6e 6e 65 6c 54 &digestChannelT
5dd0: 79 70 65 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 ype) {..Tcl_Appe
5de0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
5df0: 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 "bad channel \"
5e00: 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ", Tcl_GetChanne
5e10: 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 lName(chan),..
5e20: 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 64 69 67 "\": not a dig
5e30: 65 73 74 20 63 68 61 6e 6e 65 6c 22 2c 20 4e 55 est channel", NU
5e40: 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 LL);..Tcl_SetErr
5e50: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
5e60: 54 4c 53 22 2c 20 22 55 4e 53 54 41 43 4b 22 2c TLS", "UNSTACK",
5e70: 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 4e 56 "CHANNEL", "INV
5e80: 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a 29 20 ALID", (char *)
5e90: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
5ea0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
5eb0: 0a 20 20 20 20 2f 2a 20 50 6f 70 20 74 72 61 6e . /* Pop tran
5ec0: 73 66 6f 72 6d 20 66 72 6f 6d 20 63 68 61 6e 6e sform from chann
5ed0: 65 6c 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e el */. return
5ee0: 20 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 61 6e Tcl_UnstackChan
5ef0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e nel(interp, chan
5f00: 29 3b 0a 20 20 20 20 09 63 6c 69 65 6e 74 44 61 );. .clientDa
5f10: 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 61 3b ta = clientData;
5f20: 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .}../***********
5f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5f40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5f50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5f60: 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a ********/../*. *
5f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5fb0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 ---. *. * Digest
5fc0: 49 6e 73 74 61 6e 63 65 4f 62 6a 43 6d 64 20 2d InstanceObjCmd -
5fd0: 2d 0a 20 2a 0a 20 2a 09 48 61 6e 64 6c 65 72 20 -. *. *.Handler
5fe0: 66 6f 72 20 64 69 67 65 73 74 20 63 6f 6d 6d 61 for digest comma
5ff0: 6e 64 20 69 6e 73 74 61 6e 63 65 73 2e 20 55 73 nd instances. Us
6000: 65 64 20 74 6f 20 61 64 64 20 64 61 74 61 20 74 ed to add data t
6010: 6f 20 68 61 73 68 0a 20 2a 09 66 75 6e 63 74 69 o hash. *.functi
6020: 6f 6e 20 6f 72 20 72 65 74 72 69 65 76 65 20 6d on or retrieve m
6030: 65 73 73 61 67 65 20 64 69 67 65 73 74 2e 0a 20 essage digest..
6040: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a *. * Returns:. *
6050: 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 .TCL_OK or TCL_E
6060: 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 RROR. *. * Side
6070: 65 66 66 65 63 74 73 3a 0a 20 2a 09 41 64 64 73 effects:. *.Adds
6080: 20 64 61 74 61 20 74 6f 20 68 61 73 68 20 6f 72 data to hash or
6090: 20 72 65 74 75 72 6e 73 20 6d 65 73 73 61 67 65 returns message
60a0: 20 64 69 67 65 73 74 0a 20 2a 0a 20 2a 2d 2d 2d digest. *. *---
60b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
60f0: 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 49 . */.int DigestI
6100: 6e 73 74 61 6e 63 65 4f 62 6a 43 6d 64 28 43 6c nstanceObjCmd(Cl
6110: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
6120: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
6130: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
6140: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
6150: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
6160: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 DigestState *sta
6170: 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 tePtr = (DigestS
6180: 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 tate *) clientDa
6190: 74 61 3b 0a 20 20 20 20 69 6e 74 20 66 6e 2c 20 ta;. int fn,
61a0: 64 61 74 61 5f 6c 65 6e 20 3d 20 30 3b 0a 20 20 data_len = 0;.
61b0: 20 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 4e char *data = N
61c0: 55 4c 4c 3b 0a 20 20 20 20 73 74 61 74 69 63 20 ULL;. static
61d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e 73 74 const char *inst
61e0: 61 6e 63 65 5f 66 6e 73 20 5b 5d 20 3d 20 7b 20 ance_fns [] = {
61f0: 22 66 69 6e 61 6c 69 7a 65 22 2c 20 22 75 70 64 "finalize", "upd
6200: 61 74 65 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 0a 20 ate", NULL };..
6210: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
6220: 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 ed");.. /* Va
6230: 6c 69 64 61 74 65 20 61 72 67 20 63 6f 75 6e 74 lidate arg count
6240: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 */. if (objc
6250: 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 < 2 || objc > 3
6260: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
6270: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
6280: 20 6f 62 6a 76 2c 20 22 66 75 6e 63 74 69 6f 6e objv, "function
6290: 20 3f 64 61 74 61 3f 22 29 3b 0a 09 72 65 74 75 ?data?");..retu
62a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
62b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 }.. /* Get
62c0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 function */.
62d0: 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 if (Tcl_GetIndex
62e0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
62f0: 6f 62 6a 76 5b 31 5d 2c 20 69 6e 73 74 61 6e 63 objv[1], instanc
6300: 65 5f 66 6e 73 2c 20 22 66 75 6e 63 74 69 6f 6e e_fns, "function
6310: 22 2c 20 30 2c 20 26 66 6e 29 20 21 3d 20 54 43 ", 0, &fn) != TC
6320: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 L_OK) {..return
6330: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
6340: 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 66 75 6e 63 .. /* Do func
6350: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 tion */. if (
6360: 66 6e 29 20 7b 0a 09 2f 2a 20 47 65 74 20 64 61 fn) {../* Get da
6370: 74 61 20 6f 72 20 72 65 74 75 72 6e 20 65 72 72 ta or return err
6380: 6f 72 20 69 66 20 6e 6f 6e 65 20 2a 2f 0a 09 69 or if none */..i
6390: 66 20 28 6f 62 6a 63 20 3d 3d 20 33 29 20 7b 0a f (objc == 3) {.
63a0: 09 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f . data = Tcl_
63b0: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d GetByteArrayFrom
63c0: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 64 61 Obj(objv[2], &da
63d0: 74 61 5f 6c 65 6e 29 3b 0a 09 7d 20 65 6c 73 65 ta_len);..} else
63e0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 57 72 6f 6e {.. Tcl_Wron
63f0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
6400: 20 31 2c 20 6f 62 6a 76 2c 20 22 75 70 64 61 74 1, objv, "updat
6410: 65 20 64 61 74 61 22 29 3b 0a 09 20 20 20 20 72 e data");.. r
6420: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
6430: 0a 09 7d 0a 0a 09 2f 2a 20 55 70 64 61 74 65 20 ..}.../* Update
6440: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f hash function */
6450: 0a 09 69 66 20 28 44 69 67 65 73 74 55 70 64 61 ..if (DigestUpda
6460: 74 65 28 73 74 61 74 65 50 74 72 2c 20 64 61 74 te(statePtr, dat
6470: 61 2c 20 28 73 69 7a 65 5f 74 29 20 64 61 74 61 a, (size_t) data
6480: 5f 6c 65 6e 2c 20 31 29 20 21 3d 20 54 43 4c 5f _len, 1) != TCL_
6490: 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 OK) {.. retur
64a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
64b0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f . } else {../
64c0: 2a 20 46 69 6e 61 6c 69 7a 65 20 68 61 73 68 20 * Finalize hash
64d0: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 63 61 6c function and cal
64e0: 63 75 6c 61 74 65 20 6d 65 73 73 61 67 65 20 64 culate message d
64f0: 69 67 65 73 74 20 2a 2f 0a 09 69 66 20 28 44 69 igest */..if (Di
6500: 67 65 73 74 46 69 6e 61 6c 69 7a 65 28 69 6e 74 gestFinalize(int
6510: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 4e erp, statePtr, N
6520: 55 4c 4c 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 ULL) != TCL_OK)
6530: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 {.. return TC
6540: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 54 63 L_ERROR;..}...Tc
6550: 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 46 l_DeleteCommandF
6560: 72 6f 6d 54 6f 6b 65 6e 28 69 6e 74 65 72 70 2c romToken(interp,
6570: 20 73 74 61 74 65 50 74 72 2d 3e 74 6f 6b 65 6e statePtr->token
6580: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 );. }. ret
6590: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f urn TCL_OK;.}../
65a0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
65b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
65c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
65d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
65e0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 -------. *. * Di
65f0: 67 65 73 74 43 6f 6d 6d 61 6e 64 44 65 6c 65 74 gestCommandDelet
6600: 65 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 eHandler --. *.
6610: 2a 09 20 43 61 6c 6c 62 61 63 6b 20 74 6f 20 63 *. Callback to c
6620: 6c 65 61 6e 2d 75 70 20 77 68 65 6e 20 64 69 67 lean-up when dig
6630: 65 73 74 20 69 6e 73 74 61 6e 63 65 20 63 6f 6d est instance com
6640: 6d 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64 2e mand is deleted.
6650: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a . *. * Returns:.
6660: 20 2a 09 4e 6f 74 68 69 6e 67 0a 20 2a 0a 20 2a *.Nothing. *. *
6670: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
6680: 2a 09 44 65 73 74 72 6f 79 73 20 73 74 61 74 65 *.Destroys state
6690: 20 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a info structure.
66a0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
66b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
66c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
66d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
66e0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 --------. */.voi
66f0: 64 20 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 44 d DigestCommandD
6700: 65 6c 65 74 65 48 61 6e 64 6c 65 72 28 43 6c 69 eleteHandler(Cli
6710: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
6720: 74 61 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 ta) {. Digest
6730: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
6740: 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a = (DigestState *
6750: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 ) clientData;..
6760: 20 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20 2a /* Clean-up *
6770: 2f 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 /. DigestStat
6780: 65 46 72 65 65 28 73 74 61 74 65 50 74 72 29 3b eFree(statePtr);
6790: 0a 7d 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
67c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
67d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
67e0: 20 2a 20 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 * DigestCommand
67f0: 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 2a Handler --. *. *
6800: 09 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 . Create command
6810: 20 74 6f 20 61 6c 6c 6f 77 20 75 73 65 72 20 74 to allow user t
6820: 6f 20 61 64 64 20 64 61 74 61 20 74 6f 20 68 61 o add data to ha
6830: 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a sh function.. *.
6840: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 * Returns:. *.T
6850: 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 CL_OK or TCL_ERR
6860: 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 OR. *. * Side ef
6870: 66 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 fects:. *.Create
6880: 73 20 63 6f 6d 6d 61 6e 64 20 6f 72 20 65 72 72 s command or err
6890: 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a or message. *. *
68a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
68b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
68c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
68d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
68e0: 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 ---. */.int Dige
68f0: 73 74 43 6f 6d 6d 61 6e 64 48 61 6e 64 6c 65 72 stCommandHandler
6900: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 (Tcl_Interp *int
6910: 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d erp, Tcl_Obj *cm
6920: 64 4f 62 6a 2c 20 63 6f 6e 73 74 20 45 56 50 5f dObj, const EVP_
6930: 4d 44 20 2a 6d 64 2c 0a 09 63 6f 6e 73 74 20 45 MD *md,..const E
6940: 56 50 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 VP_CIPHER *ciphe
6950: 72 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c 20 54 r, int format, T
6960: 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 2c 20 cl_Obj *keyObj,
6970: 45 56 50 5f 4d 41 43 20 2a 6d 61 63 29 20 7b 0a EVP_MAC *mac) {.
6980: 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 DigestState
6990: 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20 63 *statePtr;. c
69a0: 68 61 72 20 2a 63 6d 64 4e 61 6d 65 20 3d 20 54 har *cmdName = T
69b0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
69c0: 4f 62 6a 28 63 6d 64 4f 62 6a 2c 20 4e 55 4c 4c Obj(cmdObj, NULL
69d0: 29 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 );.. dprintf(
69e0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
69f0: 2f 2a 20 43 72 65 61 74 65 20 73 74 61 74 65 20 /* Create state
6a00: 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20 2a data structure *
6a10: 2f 0a 20 20 20 20 69 66 20 28 28 73 74 61 74 65 /. if ((state
6a20: 50 74 72 20 3d 20 44 69 67 65 73 74 53 74 61 74 Ptr = DigestStat
6a30: 65 4e 65 77 28 69 6e 74 65 72 70 2c 20 66 6f 72 eNew(interp, for
6a40: 6d 61 74 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b mat)) == NULL) {
6a50: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
6a60: 6c 74 28 69 6e 74 65 72 70 2c 20 22 4d 65 6d 6f lt(interp, "Memo
6a70: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 ry allocation er
6a80: 72 6f 72 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ror", (char *) N
6a90: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ULL);..return TC
6aa0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
6ab0: 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a /* Initializ
6ac0: 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 e hash function
6ad0: 2a 2f 0a 20 20 20 20 69 66 20 28 44 69 67 65 73 */. if (Diges
6ae0: 74 49 6e 69 74 69 61 6c 69 7a 65 28 69 6e 74 65 tInitialize(inte
6af0: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 6d 64 rp, statePtr, md
6b00: 2c 20 63 69 70 68 65 72 2c 20 6b 65 79 4f 62 6a , cipher, keyObj
6b10: 2c 20 6d 61 63 29 20 21 3d 20 54 43 4c 5f 4f 4b , mac) != TCL_OK
6b20: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
6b30: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
6b40: 20 20 2f 2a 20 43 72 65 61 74 65 20 69 6e 73 74 /* Create inst
6b50: 61 6e 63 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a ance command */.
6b60: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 74 6f statePtr->to
6b70: 6b 65 6e 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 ken = Tcl_Create
6b80: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
6b90: 70 2c 20 63 6d 64 4e 61 6d 65 2c 20 44 69 67 65 p, cmdName, Dige
6ba0: 73 74 49 6e 73 74 61 6e 63 65 4f 62 6a 43 6d 64 stInstanceObjCmd
6bb0: 2c 0a 09 28 43 6c 69 65 6e 74 44 61 74 61 29 20 ,..(ClientData)
6bc0: 73 74 61 74 65 50 74 72 2c 20 44 69 67 65 73 74 statePtr, Digest
6bd0: 43 6f 6d 6d 61 6e 64 44 65 6c 65 74 65 48 61 6e CommandDeleteHan
6be0: 64 6c 65 72 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 dler);.. /* R
6bf0: 65 74 75 72 6e 20 63 6f 6d 6d 61 6e 64 20 6e 61 eturn command na
6c00: 6d 65 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65 me */. Tcl_Se
6c10: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
6c20: 70 2c 20 63 6d 64 4f 62 6a 29 3b 0a 20 20 20 20 p, cmdObj);.
6c30: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
6c40: 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a .../************
6c50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6c60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6c70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6c80: 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d *******/../*. *-
6c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6cd0: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 44 --. *. * DigestD
6ce0: 61 74 61 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a ataHandler --. *
6cf0: 0a 20 2a 09 52 65 74 75 72 6e 20 6d 65 73 73 61 . *.Return messa
6d00: 67 65 20 64 69 67 65 73 74 20 66 6f 72 20 64 61 ge digest for da
6d10: 74 61 20 75 73 69 6e 67 20 75 73 65 72 20 73 70 ta using user sp
6d20: 65 63 69 66 69 65 64 20 68 61 73 68 20 66 75 6e ecified hash fun
6d30: 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 ction.. *. * Ret
6d40: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 urns:. *.TCL_OK
6d50: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a or TCL_ERROR. *.
6d60: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
6d70: 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20 . *.Sets result
6d80: 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 to message diges
6d90: 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 t or error messa
6da0: 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ge. *. *--------
6db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
6df0: 69 6e 74 20 44 69 67 65 73 74 44 61 74 61 48 61 int DigestDataHa
6e00: 6e 64 6c 65 72 28 54 63 6c 5f 49 6e 74 65 72 70 ndler(Tcl_Interp
6e10: 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 *interp, Tcl_Ob
6e20: 6a 20 2a 64 61 74 61 4f 62 6a 2c 20 63 6f 6e 73 j *dataObj, cons
6e30: 74 20 45 56 50 5f 4d 44 20 2a 6d 64 2c 0a 09 63 t EVP_MD *md,..c
6e40: 6f 6e 73 74 20 45 56 50 5f 43 49 50 48 45 52 20 onst EVP_CIPHER
6e50: 2a 63 69 70 68 65 72 2c 20 69 6e 74 20 66 6f 72 *cipher, int for
6e60: 6d 61 74 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 mat, Tcl_Obj *ke
6e70: 79 4f 62 6a 2c 20 45 56 50 5f 4d 41 43 20 2a 6d yObj, EVP_MAC *m
6e80: 61 63 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a ac) {. char *
6e90: 64 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 64 61 data;. int da
6ea0: 74 61 5f 6c 65 6e 3b 0a 20 20 20 20 44 69 67 65 ta_len;. Dige
6eb0: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 stState *statePt
6ec0: 72 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 r;.. dprintf(
6ed0: 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 "Called");..
6ee0: 2f 2a 20 47 65 74 20 64 61 74 61 20 2a 2f 0a 20 /* Get data */.
6ef0: 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 data = Tcl_Ge
6f00: 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 tByteArrayFromOb
6f10: 6a 28 64 61 74 61 4f 62 6a 2c 20 26 64 61 74 61 j(dataObj, &data
6f20: 5f 6c 65 6e 29 3b 0a 20 20 20 20 69 66 20 28 64 _len);. if (d
6f30: 61 74 61 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ata == NULL) {..
6f40: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e Tcl_SetResult(in
6f50: 74 65 72 70 2c 20 22 4e 6f 20 64 61 74 61 22 2c terp, "No data",
6f60: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
6f70: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
6f80: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 .. /* Create
6f90: 73 74 61 74 65 20 64 61 74 61 20 73 74 72 75 63 state data struc
6fa0: 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 ture */. if (
6fb0: 28 73 74 61 74 65 50 74 72 20 3d 20 44 69 67 65 (statePtr = Dige
6fc0: 73 74 53 74 61 74 65 4e 65 77 28 69 6e 74 65 72 stStateNew(inter
6fd0: 70 2c 20 66 6f 72 6d 61 74 29 29 20 3d 3d 20 4e p, format)) == N
6fe0: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 ULL) {..Tcl_Appe
6ff0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
7000: 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 "Memory allocat
7010: 69 6f 6e 20 65 72 72 6f 72 22 2c 20 28 63 68 61 ion error", (cha
7020: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
7030: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
7040: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61 6c }.. /* Cal
7050: 63 20 44 69 67 65 73 74 20 2a 2f 0a 20 20 20 20 c Digest */.
7060: 69 66 20 28 44 69 67 65 73 74 49 6e 69 74 69 61 if (DigestInitia
7070: 6c 69 7a 65 28 69 6e 74 65 72 70 2c 20 73 74 61 lize(interp, sta
7080: 74 65 50 74 72 2c 20 6d 64 2c 20 63 69 70 68 65 tePtr, md, ciphe
7090: 72 2c 20 6b 65 79 4f 62 6a 2c 20 6d 61 63 29 20 r, keyObj, mac)
70a0: 21 3d 20 54 43 4c 5f 4f 4b 20 7c 7c 0a 09 44 69 != TCL_OK ||..Di
70b0: 67 65 73 74 55 70 64 61 74 65 28 73 74 61 74 65 gestUpdate(state
70c0: 50 74 72 2c 20 64 61 74 61 2c 20 28 73 69 7a 65 Ptr, data, (size
70d0: 5f 74 29 20 64 61 74 61 5f 6c 65 6e 2c 20 31 29 _t) data_len, 1)
70e0: 20 21 3d 20 54 43 4c 5f 4f 4b 20 7c 7c 0a 09 44 != TCL_OK ||..D
70f0: 69 67 65 73 74 46 69 6e 61 6c 69 7a 65 28 69 6e igestFinalize(in
7100: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 terp, statePtr,
7110: 4e 55 4c 4c 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 NULL) != TCL_OK)
7120: 20 7b 0a 09 44 69 67 65 73 74 53 74 61 74 65 46 {..DigestStateF
7130: 72 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a 09 ree(statePtr);..
7140: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
7150: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
7160: 43 6c 65 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 20 Clean-up */.
7170: 44 69 67 65 73 74 53 74 61 74 65 46 72 65 65 28 DigestStateFree(
7180: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 72 statePtr);. r
7190: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
71a0: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ./**************
71b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
71c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
71d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
71e0: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d *****/../*. *---
71f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7230: 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 46 69 6c . *. * DigestFil
7240: 65 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 eHandler --. *.
7250: 2a 09 52 65 74 75 72 6e 20 6d 65 73 73 61 67 65 *.Return message
7260: 20 64 69 67 65 73 74 20 66 6f 72 20 66 69 6c 65 digest for file
7270: 20 75 73 69 6e 67 20 75 73 65 72 20 73 70 65 63 using user spec
7280: 69 66 69 65 64 20 68 61 73 68 20 66 75 6e 63 74 ified hash funct
7290: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 ion.. *. * Retur
72a0: 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 ns:. *.TCL_OK or
72b0: 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a TCL_ERROR. *. *
72c0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
72d0: 2a 09 52 65 73 75 6c 74 20 69 73 20 6d 65 73 73 *.Result is mess
72e0: 61 67 65 20 64 69 67 65 73 74 20 6f 72 20 65 72 age digest or er
72f0: 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 ror message. *.
7300: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
7310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7340: 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 ----. */.int Dig
7350: 65 73 74 46 69 6c 65 48 61 6e 64 6c 65 72 28 54 estFileHandler(T
7360: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
7370: 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 69 6e 46 69 p, Tcl_Obj *inFi
7380: 6c 65 4f 62 6a 2c 20 63 6f 6e 73 74 20 45 56 50 leObj, const EVP
7390: 5f 4d 44 20 2a 6d 64 2c 0a 09 63 6f 6e 73 74 20 _MD *md,..const
73a0: 45 56 50 5f 43 49 50 48 45 52 20 2a 63 69 70 68 EVP_CIPHER *ciph
73b0: 65 72 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c 20 er, int format,
73c0: 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 2c Tcl_Obj *keyObj,
73d0: 20 45 56 50 5f 4d 41 43 20 2a 6d 61 63 29 20 7b EVP_MAC *mac) {
73e0: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 . DigestState
73f0: 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20 *statePtr;.
7400: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
7410: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 = NULL;. uns
7420: 69 67 6e 65 64 20 63 68 61 72 20 62 75 66 5b 42 igned char buf[B
7430: 55 46 46 45 52 5f 53 49 5a 45 5d 3b 0a 20 20 20 UFFER_SIZE];.
7440: 20 69 6e 74 20 72 65 73 20 3d 20 54 43 4c 5f 4f int res = TCL_O
7450: 4b 2c 20 6c 65 6e 3b 0a 0a 20 20 20 20 64 70 72 K, len;.. dpr
7460: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
7470: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 73 . /* Create s
7480: 74 61 74 65 20 64 61 74 61 20 73 74 72 75 63 74 tate data struct
7490: 75 72 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 ure */. if ((
74a0: 73 74 61 74 65 50 74 72 20 3d 20 44 69 67 65 73 statePtr = Diges
74b0: 74 53 74 61 74 65 4e 65 77 28 69 6e 74 65 72 70 tStateNew(interp
74c0: 2c 20 66 6f 72 6d 61 74 29 29 20 3d 3d 20 4e 55 , format)) == NU
74d0: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e LL) {..Tcl_Appen
74e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
74f0: 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 "Memory allocati
7500: 6f 6e 20 65 72 72 6f 72 22 2c 20 28 63 68 61 72 on error", (char
7510: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
7520: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
7530: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e }.. /* Open
7540: 20 66 69 6c 65 20 63 68 61 6e 6e 65 6c 20 2a 2f file channel */
7550: 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f . chan = Tcl_
7560: 46 53 4f 70 65 6e 46 69 6c 65 43 68 61 6e 6e 65 FSOpenFileChanne
7570: 6c 28 69 6e 74 65 72 70 2c 20 69 6e 46 69 6c 65 l(interp, inFile
7580: 4f 62 6a 2c 20 22 72 62 22 2c 20 30 34 34 34 29 Obj, "rb", 0444)
7590: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
75a0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
75b0: 4e 55 4c 4c 29 20 7b 0a 09 44 69 67 65 73 74 53 NULL) {..DigestS
75c0: 74 61 74 65 46 72 65 65 28 73 74 61 74 65 50 74 tateFree(statePt
75d0: 72 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f r);..return TCL_
75e0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
75f0: 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 20 63 /* Configure c
7600: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 hannel */. if
7610: 20 28 28 72 65 73 20 3d 20 54 63 6c 5f 53 65 74 ((res = Tcl_Set
7620: 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e ChannelOption(in
7630: 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 terp, chan, "-tr
7640: 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e anslation", "bin
7650: 61 72 79 22 29 29 20 21 3d 20 54 43 4c 5f 4f 4b ary")) != TCL_OK
7660: 29 20 7b 0a 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a ) {..goto done;.
7670: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 }. Tcl_Se
7680: 74 43 68 61 6e 6e 65 6c 42 75 66 66 65 72 53 69 tChannelBufferSi
7690: 7a 65 28 63 68 61 6e 2c 20 42 55 46 46 45 52 5f ze(chan, BUFFER_
76a0: 53 49 5a 45 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 SIZE);.. /* I
76b0: 6e 69 74 69 61 6c 69 7a 65 20 68 61 73 68 20 66 nitialize hash f
76c0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 unction */. i
76d0: 66 20 28 28 72 65 73 20 3d 20 44 69 67 65 73 74 f ((res = Digest
76e0: 49 6e 69 74 69 61 6c 69 7a 65 28 69 6e 74 65 72 Initialize(inter
76f0: 70 2c 20 73 74 61 74 65 50 74 72 2c 20 6d 64 2c p, statePtr, md,
7700: 20 63 69 70 68 65 72 2c 20 6b 65 79 4f 62 6a 2c cipher, keyObj,
7710: 20 6d 61 63 29 29 20 21 3d 20 54 43 4c 5f 4f 4b mac)) != TCL_OK
7720: 29 20 7b 0a 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a ) {..goto done;.
7730: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 }.. /* Re
7740: 61 64 20 66 69 6c 65 20 64 61 74 61 20 61 6e 64 ad file data and
7750: 20 75 70 64 61 74 65 20 68 61 73 68 20 66 75 6e update hash fun
7760: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 77 68 69 ction */. whi
7770: 6c 65 20 28 21 54 63 6c 5f 45 6f 66 28 63 68 61 le (!Tcl_Eof(cha
7780: 6e 29 29 20 7b 0a 09 6c 65 6e 20 3d 20 54 63 6c n)) {..len = Tcl
7790: 5f 52 65 61 64 52 61 77 28 63 68 61 6e 2c 20 28 _ReadRaw(chan, (
77a0: 63 68 61 72 20 2a 29 20 62 75 66 2c 20 42 55 46 char *) buf, BUF
77b0: 46 45 52 5f 53 49 5a 45 29 3b 0a 09 69 66 20 28 FER_SIZE);..if (
77c0: 6c 65 6e 20 3e 20 30 29 20 7b 0a 09 20 20 20 20 len > 0) {..
77d0: 69 66 20 28 44 69 67 65 73 74 55 70 64 61 74 65 if (DigestUpdate
77e0: 28 73 74 61 74 65 50 74 72 2c 20 26 62 75 66 5b (statePtr, &buf[
77f0: 30 5d 2c 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 0], (size_t) len
7800: 2c 20 31 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 , 1) != TCL_OK)
7810: 7b 0a 09 09 72 65 73 20 3d 20 54 43 4c 5f 45 52 {...res = TCL_ER
7820: 52 4f 52 3b 0a 09 09 67 6f 74 6f 20 64 6f 6e 65 ROR;...goto done
7830: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 ;.. }..}.
7840: 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 }.. /* Finali
7850: 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e ze hash function
7860: 20 61 6e 64 20 63 61 6c 63 75 6c 61 74 65 20 6d and calculate m
7870: 65 73 73 61 67 65 20 64 69 67 65 73 74 20 2a 2f essage digest */
7880: 0a 20 20 20 20 72 65 73 20 3d 20 44 69 67 65 73 . res = Diges
7890: 74 46 69 6e 61 6c 69 7a 65 28 69 6e 74 65 72 70 tFinalize(interp
78a0: 2c 20 73 74 61 74 65 50 74 72 2c 20 4e 55 4c 4c , statePtr, NULL
78b0: 29 3b 0a 0a 64 6f 6e 65 3a 0a 20 20 20 20 2f 2a );..done:. /*
78c0: 20 43 6c 6f 73 65 20 63 68 61 6e 6e 65 6c 20 2a Close channel *
78d0: 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 43 6c /. if (Tcl_Cl
78e0: 6f 73 65 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ose(interp, chan
78f0: 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 ) == TCL_ERROR)
7900: 7b 0a 09 72 65 73 20 3d 20 54 43 4c 5f 45 52 52 {..res = TCL_ERR
7910: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
7920: 2a 20 43 6c 65 61 6e 2d 75 70 20 2a 2f 0a 20 20 * Clean-up */.
7930: 20 20 44 69 67 65 73 74 53 74 61 74 65 46 72 65 DigestStateFre
7940: 65 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 e(statePtr);.
7950: 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a return res;.}..
7960: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /***************
7970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
79a0: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d ****/../*. *----
79b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
79c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
79d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
79e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
79f0: 20 2a 0a 20 2a 20 47 65 74 44 69 67 65 73 74 20 *. * GetDigest
7a00: 2d 2d 20 47 65 74 20 6d 65 73 73 61 67 65 20 64 -- Get message d
7a10: 69 67 65 73 74 0a 20 2a 0a 20 2a 20 52 65 74 75 igest. *. * Retu
7a20: 72 6e 73 3a 0a 20 2a 09 45 56 50 5f 4d 44 20 2a rns:. *.EVP_MD *
7a30: 20 6f 72 20 4e 55 4c 4c 0a 20 2a 0a 20 2a 2d 2d or NULL. *. *--
7a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a80: 2d 0a 20 2a 2f 0a 45 56 50 5f 4d 44 20 2a 47 65 -. */.EVP_MD *Ge
7a90: 74 44 69 67 65 73 74 28 54 63 6c 5f 49 6e 74 65 tDigest(Tcl_Inte
7aa0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f rp *interp, Tcl_
7ab0: 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 20 69 6e 74 Obj *objPtr, int
7ac0: 20 2a 66 6f 72 6d 61 74 29 20 7b 0a 20 20 20 20 *format) {.
7ad0: 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 const EVP_MD *md
7ae0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 = NULL;. cha
7af0: 72 20 2a 64 69 67 65 73 74 4e 61 6d 65 20 3d 20 r *digestName =
7b00: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f Tcl_GetStringFro
7b10: 6d 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 4e 55 4c mObj(objPtr, NUL
7b20: 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 64 69 67 L);.. if (dig
7b30: 65 73 74 4e 61 6d 65 20 21 3d 20 4e 55 4c 4c 29 estName != NULL)
7b40: 20 7b 0a 09 6d 64 20 3d 20 45 56 50 5f 67 65 74 {..md = EVP_get
7b50: 5f 64 69 67 65 73 74 62 79 6e 61 6d 65 28 64 69 _digestbyname(di
7b60: 67 65 73 74 4e 61 6d 65 29 3b 0a 09 69 66 20 28 gestName);..if (
7b70: 6d 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 md == NULL) {..
7b80: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
7b90: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 76 ult(interp, "Inv
7ba0: 61 6c 69 64 20 64 69 67 65 73 74 20 5c 22 22 2c alid digest \"",
7bb0: 20 64 69 67 65 73 74 4e 61 6d 65 2c 20 22 5c 22 digestName, "\"
7bc0: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 ", NULL);.. r
7bd0: 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 7d 20 65 eturn NULL;..} e
7be0: 6c 73 65 20 69 66 20 28 6d 64 20 3d 3d 20 45 56 lse if (md == EV
7bf0: 50 5f 73 68 61 6b 65 31 32 38 28 29 20 7c 7c 20 P_shake128() ||
7c00: 6d 64 20 3d 3d 20 45 56 50 5f 73 68 61 6b 65 32 md == EVP_shake2
7c10: 35 36 28 29 29 20 7b 0a 09 20 20 20 20 2a 66 6f 56()) {.. *fo
7c20: 72 6d 61 74 20 7c 3d 20 49 53 5f 58 4f 46 3b 0a rmat |= IS_XOF;.
7c30: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a .}. } else {.
7c40: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
7c50: 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 64 69 t(interp, "No di
7c60: 67 65 73 74 20 73 70 65 63 69 66 69 65 64 22 2c gest specified",
7c70: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
7c80: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 NULL;. }.
7c90: 72 65 74 75 72 6e 20 6d 64 3b 0a 7d 0a 0a 2f 2a return md;.}../*
7ca0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
7cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ce0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 47 65 74 ------. *. * Get
7cf0: 43 69 70 68 65 72 20 2d 2d 20 47 65 74 20 63 69 Cipher -- Get ci
7d00: 70 68 65 72 0a 20 2a 0a 20 2a 20 52 65 74 75 72 pher. *. * Retur
7d10: 6e 73 3a 0a 20 2a 09 45 56 50 5f 43 49 50 48 45 ns:. *.EVP_CIPHE
7d20: 52 20 2a 20 6f 72 20 4e 55 4c 4c 0a 20 2a 0a 20 R * or NULL. *.
7d30: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
7d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d70: 2d 2d 2d 2d 0a 20 2a 2f 0a 45 56 50 5f 43 49 50 ----. */.EVP_CIP
7d80: 48 45 52 20 2a 47 65 74 43 69 70 68 65 72 28 54 HER *GetCipher(T
7d90: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
7da0: 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 p, Tcl_Obj *objP
7db0: 74 72 2c 20 69 6e 74 20 2a 74 79 70 65 29 20 7b tr, int *type) {
7dc0: 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 43 . const EVP_C
7dd0: 49 50 48 45 52 20 2a 63 69 70 68 65 72 20 3d 20 IPHER *cipher =
7de0: 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 72 20 2a NULL;. char *
7df0: 63 69 70 68 65 72 4e 61 6d 65 20 3d 20 54 63 6c cipherName = Tcl
7e00: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
7e10: 6a 28 6f 62 6a 50 74 72 2c 20 4e 55 4c 4c 29 3b j(objPtr, NULL);
7e20: 0a 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72 .. if (cipher
7e30: 4e 61 6d 65 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a Name != NULL) {.
7e40: 09 63 69 70 68 65 72 20 3d 20 45 56 50 5f 67 65 .cipher = EVP_ge
7e50: 74 5f 63 69 70 68 65 72 62 79 6e 61 6d 65 28 63 t_cipherbyname(c
7e60: 69 70 68 65 72 4e 61 6d 65 29 3b 0a 09 2a 74 79 ipherName);..*ty
7e70: 70 65 20 3d 20 54 59 50 45 5f 43 4d 41 43 3b 0a pe = TYPE_CMAC;.
7e80: 09 69 66 20 28 63 69 70 68 65 72 20 3d 3d 20 4e .if (cipher == N
7e90: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f ULL) {.. Tcl_
7ea0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
7eb0: 65 72 70 2c 20 22 49 6e 76 61 6c 69 64 20 63 69 erp, "Invalid ci
7ec0: 70 68 65 72 20 5c 22 22 2c 20 63 69 70 68 65 72 pher \"", cipher
7ed0: 4e 61 6d 65 2c 20 22 5c 22 22 2c 20 4e 55 4c 4c Name, "\"", NULL
7ee0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e );.. return N
7ef0: 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c ULL;..}. } el
7f00: 73 65 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 se {..Tcl_Append
7f10: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
7f20: 4e 6f 20 63 69 70 68 65 72 20 73 70 65 63 69 66 No cipher specif
7f30: 69 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ied", NULL);..re
7f40: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
7f50: 0a 20 20 20 20 72 65 74 75 72 6e 20 63 69 70 68 . return ciph
7f60: 65 72 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d er;.}../*. *----
7f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
7fb0: 20 2a 0a 20 2a 20 47 65 74 4b 65 79 20 2d 2d 20 *. * GetKey --
7fc0: 47 65 74 20 6b 65 79 0a 20 2a 0a 20 2a 20 52 65 Get key. *. * Re
7fd0: 74 75 72 6e 73 3a 0a 20 2a 09 75 6e 73 69 67 6e turns:. *.unsign
7fe0: 65 64 20 63 68 61 72 20 2a 20 6f 72 20 4e 55 4c ed char * or NUL
7ff0: 4c 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d L. *. *---------
8000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 75 ----------. */.u
8040: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 47 65 nsigned char *Ge
8050: 74 4b 65 79 28 54 63 6c 5f 49 6e 74 65 72 70 20 tKey(Tcl_Interp
8060: 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a *interp, Tcl_Obj
8070: 20 2a 6f 62 6a 50 74 72 2c 20 69 6e 74 20 2a 74 *objPtr, int *t
8080: 79 70 65 29 20 7b 0a 20 20 20 20 75 6e 73 69 67 ype) {. unsig
8090: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 20 3d 20 ned char *key =
80a0: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 Tcl_GetByteArray
80b0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 FromObj(objPtr,
80c0: 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 NULL);.. if (
80d0: 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 key == NULL) {..
80e0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
80f0: 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 6b 65 79 (interp, "No key
8100: 20 73 70 65 63 69 66 69 65 64 22 2c 20 4e 55 4c specified", NUL
8110: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c L);..return NULL
8120: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
8130: 2a 74 79 70 65 20 3d 3d 20 54 59 50 45 5f 4d 44 *type == TYPE_MD
8140: 29 20 7b 0a 09 2a 74 79 70 65 20 3d 20 54 59 50 ) {..*type = TYP
8150: 45 5f 48 4d 41 43 3b 0a 20 20 20 20 7d 0a 20 20 E_HMAC;. }.
8160: 20 20 72 65 74 75 72 6e 20 6b 65 79 3b 0a 7d 0a return key;.}.
8170: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
8180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
81a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
81b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
81c0: 47 65 74 4d 41 43 20 2d 2d 20 47 65 74 20 4d 41 GetMAC -- Get MA
81d0: 43 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a C. *. * Returns:
81e0: 0a 20 2a 09 45 56 50 5f 4d 41 43 20 2a 20 6f 72 . *.EVP_MAC * or
81f0: 20 4e 55 4c 4c 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d NULL. *. *-----
8200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
8240: 2a 2f 0a 45 56 50 5f 4d 41 43 20 2a 47 65 74 4d */.EVP_MAC *GetM
8250: 41 43 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 AC(Tcl_Interp *i
8260: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a nterp, Tcl_Obj *
8270: 6f 62 6a 50 74 72 2c 20 69 6e 74 20 2a 74 79 70 objPtr, int *typ
8280: 65 29 20 7b 0a 20 20 20 20 45 56 50 5f 4d 41 43 e) {. EVP_MAC
8290: 20 2a 6d 61 63 20 3d 20 4e 55 4c 4c 3b 0a 20 20 *mac = NULL;.
82a0: 20 20 63 68 61 72 20 2a 6d 61 63 4e 61 6d 65 20 char *macName
82b0: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 = Tcl_GetStringF
82c0: 72 6f 6d 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 4e romObj(objPtr, N
82d0: 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 20 28 6d ULL);.. if (m
82e0: 61 63 4e 61 6d 65 20 21 3d 20 4e 55 4c 4c 29 20 acName != NULL)
82f0: 7b 0a 09 69 66 20 28 73 74 72 63 6d 70 28 6d 61 {..if (strcmp(ma
8300: 63 4e 61 6d 65 2c 20 22 63 6d 61 63 22 29 20 3d cName, "cmac") =
8310: 3d 20 30 29 20 7b 0a 09 20 20 20 20 2a 74 79 70 = 0) {.. *typ
8320: 65 20 3d 20 54 59 50 45 5f 43 4d 41 43 3b 0a 09 e = TYPE_CMAC;..
8330: 7d 20 65 6c 73 65 20 69 66 20 28 73 74 72 63 6d } else if (strcm
8340: 70 28 6d 61 63 4e 61 6d 65 2c 20 22 68 6d 61 63 p(macName, "hmac
8350: 22 29 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 ") == 0) {..
8360: 2a 74 79 70 65 20 3d 20 54 59 50 45 5f 48 4d 41 *type = TYPE_HMA
8370: 43 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 C;..} else {..
8380: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
8390: 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 76 61 lt(interp, "Inva
83a0: 6c 69 64 20 4d 41 43 20 5c 22 22 2c 20 6d 61 63 lid MAC \"", mac
83b0: 4e 61 6d 65 2c 20 22 5c 22 22 2c 20 4e 55 4c 4c Name, "\"", NULL
83c0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e );.. return N
83d0: 55 4c 4c 3b 0a 09 7d 0a 09 6d 61 63 20 3d 20 28 ULL;..}..mac = (
83e0: 76 6f 69 64 20 2a 29 20 6d 61 63 4e 61 6d 65 3b void *) macName;
83f0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 . } else {..T
8400: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
8410: 69 6e 74 65 72 70 2c 20 22 4e 6f 20 4d 41 43 20 interp, "No MAC
8420: 73 70 65 63 69 66 69 65 64 22 2c 20 4e 55 4c 4c specified", NULL
8430: 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b );..return NULL;
8440: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
8450: 6e 20 6d 61 63 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a n mac;.}../*****
8460: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8470: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8480: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
8490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a **************/.
84a0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
84b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
84c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
84d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
84e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
84f0: 44 69 67 65 73 74 4d 61 69 6e 20 2d 2d 0a 20 2a DigestMain --. *
8500: 0a 20 2a 09 52 65 74 75 72 6e 20 6d 65 73 73 61 . *.Return messa
8510: 67 65 20 64 69 67 65 73 74 20 6f 72 20 4d 65 73 ge digest or Mes
8520: 73 61 67 65 20 41 75 74 68 65 6e 74 69 63 61 74 sage Authenticat
8530: 69 6f 6e 20 43 6f 64 65 20 28 4d 41 43 29 20 6f ion Code (MAC) o
8540: 66 0a 20 2a 09 64 61 74 61 20 75 73 69 6e 67 20 f. *.data using
8550: 75 73 65 72 20 73 70 65 63 69 66 69 65 64 20 68 user specified h
8560: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a ash function.. *
8570: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 . * Returns:. *.
8580: 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 TCL_OK or TCL_ER
8590: 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ROR. *. * Side e
85a0: 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 ffects:. *.Sets
85b0: 72 65 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 67 result to messag
85c0: 65 20 64 69 67 65 73 74 20 6f 72 20 65 72 72 6f e digest or erro
85d0: 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d r message. *. *-
85e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
85f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8620: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
8630: 74 20 44 69 67 65 73 74 4d 61 69 6e 28 69 6e 74 t DigestMain(int
8640: 20 74 79 70 65 2c 20 54 63 6c 5f 49 6e 74 65 72 type, Tcl_Inter
8650: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
8660: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
8670: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
8680: 20 20 69 6e 74 20 69 64 78 2c 20 73 74 61 72 74 int idx, start
8690: 20 3d 20 31 2c 20 66 6f 72 6d 61 74 20 3d 20 48 = 1, format = H
86a0: 45 58 5f 46 4f 52 4d 41 54 2c 20 72 65 73 20 3d EX_FORMAT, res =
86b0: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 54 63 6c TCL_OK;. Tcl
86c0: 5f 4f 62 6a 20 2a 63 69 70 68 65 72 4f 62 6a 20 _Obj *cipherObj
86d0: 3d 20 4e 55 4c 4c 2c 20 2a 63 6d 64 4f 62 6a 20 = NULL, *cmdObj
86e0: 3d 20 4e 55 4c 4c 2c 20 2a 64 61 74 61 4f 62 6a = NULL, *dataObj
86f0: 20 3d 20 4e 55 4c 4c 2c 20 2a 64 69 67 65 73 74 = NULL, *digest
8700: 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 Obj = NULL;.
8710: 54 63 6c 5f 4f 62 6a 20 2a 66 69 6c 65 4f 62 6a Tcl_Obj *fileObj
8720: 20 3d 20 4e 55 4c 4c 2c 20 2a 6b 65 79 4f 62 6a = NULL, *keyObj
8730: 20 3d 20 4e 55 4c 4c 2c 20 2a 6d 61 63 4f 62 6a = NULL, *macObj
8740: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e = NULL;. con
8750: 73 74 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c st char *channel
8760: 20 3d 20 4e 55 4c 4c 2c 20 2a 6f 70 74 3b 0a 20 = NULL, *opt;.
8770: 20 20 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 const EVP_MD
8780: 2a 6d 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 *md = NULL;.
8790: 63 6f 6e 73 74 20 45 56 50 5f 43 49 50 48 45 52 const EVP_CIPHER
87a0: 20 2a 63 69 70 68 65 72 20 3d 20 4e 55 4c 4c 3b *cipher = NULL;
87b0: 0a 20 20 20 20 45 56 50 5f 4d 41 43 20 2a 6d 61 . EVP_MAC *ma
87c0: 63 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 64 c = NULL;.. d
87d0: 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 printf("Called")
87e0: 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 72 20 ;.. /* Clear
87f0: 69 6e 74 65 72 70 20 72 65 73 75 6c 74 20 2a 2f interp result */
8800: 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 . Tcl_ResetRe
8810: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 0a 20 sult(interp);..
8820: 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 /* Validate a
8830: 72 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 rg count */.
8840: 69 66 20 28 6f 62 6a 63 20 3c 20 33 20 7c 7c 20 if (objc < 3 ||
8850: 6f 62 6a 63 20 3e 20 31 32 29 20 7b 0a 09 54 63 objc > 12) {..Tc
8860: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
8870: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
8880: 22 3f 2d 62 69 6e 7c 2d 68 65 78 3f 20 3f 2d 63 "?-bin|-hex? ?-c
8890: 69 70 68 65 72 20 6e 61 6d 65 3f 20 3f 2d 64 69 ipher name? ?-di
88a0: 67 65 73 74 20 6e 61 6d 65 3f 20 3f 2d 6b 65 79 gest name? ?-key
88b0: 20 6b 65 79 3f 20 3f 2d 6d 61 63 20 6e 61 6d 65 key? ?-mac name
88c0: 3f 20 5b 2d 63 68 61 6e 6e 65 6c 20 63 68 61 6e ? [-channel chan
88d0: 20 7c 20 2d 63 6f 6d 6d 61 6e 64 20 63 6d 64 4e | -command cmdN
88e0: 61 6d 65 20 7c 20 2d 66 69 6c 65 20 66 69 6c 65 ame | -file file
88f0: 6e 61 6d 65 20 7c 20 3f 2d 64 61 74 61 3f 20 64 name | ?-data? d
8900: 61 74 61 5d 22 29 3b 0a 09 72 65 74 75 72 6e 20 ata]");..return
8910: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
8920: 0a 0a 20 20 20 20 2f 2a 20 53 70 65 63 69 61 6c .. /* Special
8930: 20 63 61 73 65 20 6f 66 20 66 69 72 73 74 20 61 case of first a
8940: 72 67 20 69 73 20 64 69 67 65 73 74 2c 20 63 69 rg is digest, ci
8950: 70 68 65 72 2c 20 6f 72 20 6d 61 63 20 2a 2f 0a pher, or mac */.
8960: 20 20 20 20 6f 70 74 20 3d 20 54 63 6c 5f 47 65 opt = Tcl_Ge
8970: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f tStringFromObj(o
8980: 62 6a 76 5b 73 74 61 72 74 5d 2c 20 4e 55 4c 4c bjv[start], NULL
8990: 29 3b 0a 20 20 20 20 69 66 20 28 6f 70 74 5b 30 );. if (opt[0
89a0: 5d 20 21 3d 20 27 2d 27 29 20 7b 0a 09 69 66 20 ] != '-') {..if
89b0: 28 74 79 70 65 20 3d 3d 20 54 59 50 45 5f 4d 44 (type == TYPE_MD
89c0: 20 7c 7c 20 74 79 70 65 20 3d 3d 20 54 59 50 45 || type == TYPE
89d0: 5f 48 4d 41 43 29 20 7b 0a 09 20 20 20 20 64 69 _HMAC) {.. di
89e0: 67 65 73 74 4f 62 6a 20 3d 20 6f 62 6a 76 5b 73 gestObj = objv[s
89f0: 74 61 72 74 5d 3b 0a 09 20 20 20 20 73 74 61 72 tart];.. star
8a00: 74 2b 2b 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 t++;..} else if
8a10: 28 74 79 70 65 20 3d 3d 20 54 59 50 45 5f 43 4d (type == TYPE_CM
8a20: 41 43 29 20 7b 0a 09 20 20 20 20 63 69 70 68 65 AC) {.. ciphe
8a30: 72 4f 62 6a 20 3d 20 6f 62 6a 76 5b 73 74 61 72 rObj = objv[star
8a40: 74 5d 3b 0a 09 20 20 20 20 73 74 61 72 74 2b 2b t];.. start++
8a50: 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 74 79 ;..} else if (ty
8a60: 70 65 20 3d 3d 20 54 59 50 45 5f 4d 41 43 29 20 pe == TYPE_MAC)
8a70: 7b 0a 09 20 20 20 20 6d 61 63 4f 62 6a 20 3d 20 {.. macObj =
8a80: 6f 62 6a 76 5b 73 74 61 72 74 5d 3b 0a 09 20 20 objv[start];..
8a90: 20 20 73 74 61 72 74 2b 2b 3b 0a 09 7d 0a 20 20 start++;..}.
8aa0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 }.. /* Get
8ab0: 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 66 options */. f
8ac0: 6f 72 20 28 69 64 78 20 3d 20 73 74 61 72 74 3b or (idx = start;
8ad0: 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 idx < objc; idx
8ae0: 2b 2b 29 20 7b 0a 09 6f 70 74 20 3d 20 54 63 6c ++) {..opt = Tcl
8af0: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 _GetStringFromOb
8b00: 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e 55 4c j(objv[idx], NUL
8b10: 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b 30 5d L);...if (opt[0]
8b20: 20 21 3d 20 27 2d 27 29 20 7b 0a 09 20 20 20 20 != '-') {..
8b30: 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 4f 50 54 46 break;..}...OPTF
8b40: 4c 41 47 28 22 2d 62 69 6e 22 2c 20 66 6f 72 6d LAG("-bin", form
8b50: 61 74 2c 20 42 49 4e 5f 46 4f 52 4d 41 54 29 3b at, BIN_FORMAT);
8b60: 0a 09 4f 50 54 46 4c 41 47 28 22 2d 62 69 6e 61 ..OPTFLAG("-bina
8b70: 72 79 22 2c 20 66 6f 72 6d 61 74 2c 20 42 49 4e ry", format, BIN
8b80: 5f 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 46 4c _FORMAT);..OPTFL
8b90: 41 47 28 22 2d 68 65 78 22 2c 20 66 6f 72 6d 61 AG("-hex", forma
8ba0: 74 2c 20 48 45 58 5f 46 4f 52 4d 41 54 29 3b 0a t, HEX_FORMAT);.
8bb0: 09 4f 50 54 46 4c 41 47 28 22 2d 68 65 78 61 64 .OPTFLAG("-hexad
8bc0: 65 63 69 6d 61 6c 22 2c 20 66 6f 72 6d 61 74 2c ecimal", format,
8bd0: 20 48 45 58 5f 46 4f 52 4d 41 54 29 3b 0a 09 4f HEX_FORMAT);..O
8be0: 50 54 53 54 52 28 22 2d 63 68 61 6e 22 2c 20 63 PTSTR("-chan", c
8bf0: 68 61 6e 6e 65 6c 29 3b 0a 09 4f 50 54 53 54 52 hannel);..OPTSTR
8c00: 28 22 2d 63 68 61 6e 6e 65 6c 22 2c 20 63 68 61 ("-channel", cha
8c10: 6e 6e 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 nnel);..OPTOBJ("
8c20: 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68 65 72 -cipher", cipher
8c30: 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d Obj);..OPTOBJ("-
8c40: 63 6f 6d 6d 61 6e 64 22 2c 20 63 6d 64 4f 62 6a command", cmdObj
8c50: 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 64 61 74 );..OPTOBJ("-dat
8c60: 61 22 2c 20 64 61 74 61 4f 62 6a 29 3b 0a 09 4f a", dataObj);..O
8c70: 50 54 4f 42 4a 28 22 2d 64 69 67 65 73 74 22 2c PTOBJ("-digest",
8c80: 20 64 69 67 65 73 74 4f 62 6a 29 3b 0a 09 4f 50 digestObj);..OP
8c90: 54 4f 42 4a 28 22 2d 66 69 6c 65 22 2c 20 66 69 TOBJ("-file", fi
8ca0: 6c 65 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28 leObj);..OPTOBJ(
8cb0: 22 2d 66 69 6c 65 6e 61 6d 65 22 2c 20 66 69 6c "-filename", fil
8cc0: 65 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 eObj);..OPTOBJ("
8cd0: 2d 6b 65 79 22 2c 20 6b 65 79 4f 62 6a 29 3b 0a -key", keyObj);.
8ce0: 09 4f 50 54 4f 42 4a 28 22 2d 6d 61 63 22 2c 20 .OPTOBJ("-mac",
8cf0: 6d 61 63 4f 62 6a 29 3b 0a 0a 09 4f 50 54 42 41 macObj);...OPTBA
8d00: 44 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 62 69 D("option", "-bi
8d10: 6e 2c 20 2d 63 68 61 6e 6e 65 6c 2c 20 2d 63 69 n, -channel, -ci
8d20: 70 68 65 72 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 pher, -command,
8d30: 2d 64 61 74 61 2c 20 2d 64 69 67 65 73 74 2c 20 -data, -digest,
8d40: 2d 66 69 6c 65 2c 20 2d 66 69 6c 65 6e 61 6d 65 -file, -filename
8d50: 2c 20 2d 68 65 78 2c 20 2d 6b 65 79 2c 20 6f 72 , -hex, -key, or
8d60: 20 2d 6d 61 63 22 29 3b 0a 09 72 65 74 75 72 6e -mac");..return
8d70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
8d80: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6f 6e 6c }.. /* If onl
8d90: 79 20 31 20 61 72 67 20 6c 65 66 74 2c 20 69 74 y 1 arg left, it
8da0: 27 73 20 74 68 65 20 64 61 74 61 20 2a 2f 0a 20 's the data */.
8db0: 20 20 20 69 66 20 28 69 64 78 20 3c 20 6f 62 6a if (idx < obj
8dc0: 63 20 26 26 20 64 61 74 61 4f 62 6a 20 3d 3d 20 c && dataObj ==
8dd0: 4e 55 4c 4c 29 20 7b 0a 09 64 61 74 61 4f 62 6a NULL) {..dataObj
8de0: 20 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 20 20 = objv[idx];.
8df0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 }.. /* Get
8e00: 63 69 70 68 65 72 20 2a 2f 0a 20 20 20 20 69 66 cipher */. if
8e10: 20 28 63 69 70 68 65 72 4f 62 6a 20 21 3d 20 4e (cipherObj != N
8e20: 55 4c 4c 29 20 7b 0a 09 69 66 20 28 28 63 69 70 ULL) {..if ((cip
8e30: 68 65 72 20 3d 20 47 65 74 43 69 70 68 65 72 28 her = GetCipher(
8e40: 69 6e 74 65 72 70 2c 20 63 69 70 68 65 72 4f 62 interp, cipherOb
8e50: 6a 2c 20 26 74 79 70 65 29 29 20 3d 3d 20 4e 55 j, &type)) == NU
8e60: 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 LL) {.. retur
8e70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
8e80: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 74 } else if (t
8e90: 79 70 65 20 3d 3d 20 54 59 50 45 5f 43 4d 41 43 ype == TYPE_CMAC
8ea0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
8eb0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e esult(interp, "N
8ec0: 6f 20 63 69 70 68 65 72 20 73 70 65 63 69 66 69 o cipher specifi
8ed0: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 ed", NULL);..ret
8ee0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
8ef0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 }.. /* Get
8f00: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 message digest
8f10: 2a 2f 0a 20 20 20 20 69 66 20 28 64 69 67 65 73 */. if (diges
8f20: 74 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a tObj != NULL) {.
8f30: 09 69 66 20 28 28 6d 64 20 3d 20 47 65 74 44 69 .if ((md = GetDi
8f40: 67 65 73 74 28 69 6e 74 65 72 70 2c 20 64 69 67 gest(interp, dig
8f50: 65 73 74 4f 62 6a 2c 20 26 66 6f 72 6d 61 74 29 estObj, &format)
8f60: 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 ) == NULL) {..
8f70: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
8f80: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 OR;..}. } els
8f90: 65 20 69 66 20 28 74 79 70 65 20 3d 3d 20 54 59 e if (type == TY
8fa0: 50 45 5f 4d 44 20 7c 7c 20 74 79 70 65 20 3d 3d PE_MD || type ==
8fb0: 20 54 59 50 45 5f 48 4d 41 43 29 20 7b 0a 09 54 TYPE_HMAC) {..T
8fc0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
8fd0: 69 6e 74 65 72 70 2c 20 22 4e 6f 20 64 69 67 65 interp, "No dige
8fe0: 73 74 20 73 70 65 63 69 66 69 65 64 22 2c 20 4e st specified", N
8ff0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ULL);..return TC
9000: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
9010: 20 20 20 20 2f 2a 20 47 65 74 20 6b 65 79 20 2a /* Get key *
9020: 2f 0a 20 20 20 20 69 66 20 28 6b 65 79 4f 62 6a /. if (keyObj
9030: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 != NULL) {..if
9040: 28 47 65 74 4b 65 79 28 69 6e 74 65 72 70 2c 20 (GetKey(interp,
9050: 6b 65 79 4f 62 6a 2c 20 26 74 79 70 65 29 20 3d keyObj, &type) =
9060: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72 = NULL) {.. r
9070: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
9080: 09 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 ...}. } else
9090: 69 66 20 28 74 79 70 65 20 21 3d 20 54 59 50 45 if (type != TYPE
90a0: 5f 4d 44 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 _MD) {..Tcl_Appe
90b0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
90c0: 20 22 4e 6f 20 6b 65 79 20 73 70 65 63 69 66 69 "No key specifi
90d0: 65 64 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 ed", NULL);..ret
90e0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
90f0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 }.. /* Get
9100: 20 4d 41 43 20 2a 2f 0a 20 20 20 20 69 66 20 28 MAC */. if (
9110: 6d 61 63 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 macObj != NULL)
9120: 7b 0a 09 69 66 20 28 28 6d 61 63 20 3d 20 47 65 {..if ((mac = Ge
9130: 74 4d 41 43 28 69 6e 74 65 72 70 2c 20 6d 61 63 tMAC(interp, mac
9140: 4f 62 6a 2c 20 26 74 79 70 65 29 29 20 3d 3d 20 Obj, &type)) ==
9150: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65 74 NULL) {.. ret
9160: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
9170: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 }. } else if
9180: 28 74 79 70 65 20 3d 3d 20 54 59 50 45 5f 4d 41 (type == TYPE_MA
9190: 43 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 C) {..Tcl_Append
91a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 Result(interp, "
91b0: 4e 6f 20 4d 41 43 20 73 70 65 63 69 66 69 65 64 No MAC specified
91c0: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 ", NULL);..retur
91d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
91e0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 63 20 }.. /* Calc
91f0: 64 69 67 65 73 74 20 6f 6e 20 66 69 6c 65 2c 20 digest on file,
9200: 73 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 2c stacked channel,
9210: 20 75 73 69 6e 67 20 69 6e 73 74 61 6e 63 65 20 using instance
9220: 63 6f 6d 6d 61 6e 64 2c 20 6f 72 20 64 61 74 61 command, or data
9230: 20 62 6c 6f 62 20 2a 2f 0a 20 20 20 20 69 66 20 blob */. if
9240: 28 66 69 6c 65 4f 62 6a 20 21 3d 20 4e 55 4c 4c (fileObj != NULL
9250: 29 20 7b 0a 09 72 65 73 20 3d 20 44 69 67 65 73 ) {..res = Diges
9260: 74 46 69 6c 65 48 61 6e 64 6c 65 72 28 69 6e 74 tFileHandler(int
9270: 65 72 70 2c 20 66 69 6c 65 4f 62 6a 2c 20 6d 64 erp, fileObj, md
9280: 2c 20 63 69 70 68 65 72 2c 20 66 6f 72 6d 61 74 , cipher, format
9290: 20 7c 20 74 79 70 65 2c 20 6b 65 79 4f 62 6a 2c | type, keyObj,
92a0: 20 6d 61 63 29 3b 0a 20 20 20 20 7d 20 65 6c 73 mac);. } els
92b0: 65 20 69 66 20 28 63 68 61 6e 6e 65 6c 20 21 3d e if (channel !=
92c0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d 20 NULL) {..res =
92d0: 44 69 67 65 73 74 43 68 61 6e 6e 65 6c 48 61 6e DigestChannelHan
92e0: 64 6c 65 72 28 69 6e 74 65 72 70 2c 20 63 68 61 dler(interp, cha
92f0: 6e 6e 65 6c 2c 20 6d 64 2c 20 63 69 70 68 65 72 nnel, md, cipher
9300: 2c 20 66 6f 72 6d 61 74 20 7c 20 74 79 70 65 2c , format | type,
9310: 20 6b 65 79 4f 62 6a 2c 20 6d 61 63 29 3b 0a 20 keyObj, mac);.
9320: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6d } else if (cm
9330: 64 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a dObj != NULL) {.
9340: 09 72 65 73 20 3d 20 44 69 67 65 73 74 43 6f 6d .res = DigestCom
9350: 6d 61 6e 64 48 61 6e 64 6c 65 72 28 69 6e 74 65 mandHandler(inte
9360: 72 70 2c 20 63 6d 64 4f 62 6a 2c 20 6d 64 2c 20 rp, cmdObj, md,
9370: 63 69 70 68 65 72 2c 20 66 6f 72 6d 61 74 20 7c cipher, format |
9380: 20 74 79 70 65 2c 20 6b 65 79 4f 62 6a 2c 20 6d type, keyObj, m
9390: 61 63 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 ac);. } else
93a0: 69 66 20 28 64 61 74 61 4f 62 6a 20 21 3d 20 4e if (dataObj != N
93b0: 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d 20 44 69 ULL) {..res = Di
93c0: 67 65 73 74 44 61 74 61 48 61 6e 64 6c 65 72 28 gestDataHandler(
93d0: 69 6e 74 65 72 70 2c 20 64 61 74 61 4f 62 6a 2c interp, dataObj,
93e0: 20 6d 64 2c 20 63 69 70 68 65 72 2c 20 66 6f 72 md, cipher, for
93f0: 6d 61 74 20 7c 20 74 79 70 65 2c 20 6b 65 79 4f mat | type, keyO
9400: 62 6a 2c 20 6d 61 63 29 3b 0a 20 20 20 20 7d 20 bj, mac);. }
9410: 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 41 70 70 65 else {..Tcl_Appe
9420: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
9430: 20 22 4e 6f 20 6f 70 65 72 61 74 69 6f 6e 20 73 "No operation s
9440: 70 65 63 69 66 69 65 64 3a 20 55 73 65 20 2d 63 pecified: Use -c
9450: 68 61 6e 6e 65 6c 2c 20 2d 63 6f 6d 6d 61 6e 64 hannel, -command
9460: 2c 20 2d 64 61 74 61 2c 20 6f 72 20 2d 66 69 6c , -data, or -fil
9470: 65 20 6f 70 74 69 6f 6e 22 2c 20 4e 55 4c 4c 29 e option", NULL)
9480: 3b 0a 09 72 65 73 20 3d 20 54 43 4c 5f 45 52 52 ;..res = TCL_ERR
9490: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 OR;. }. re
94a0: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a turn res;.}../*.
94b0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
94c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
94d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
94e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
94f0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 73 -----. *. * Mess
9500: 61 67 65 20 44 69 67 65 73 74 20 61 6e 64 20 4d age Digest and M
9510: 65 73 73 61 67 65 20 41 75 74 68 65 6e 74 69 63 essage Authentic
9520: 61 74 69 6f 6e 20 43 6f 64 65 20 43 6f 6d 6d 61 ation Code Comma
9530: 6e 64 73 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 nds --. *. *.Ret
9540: 75 72 6e 20 4d 65 73 73 61 67 65 20 44 69 67 65 urn Message Dige
9550: 73 74 20 28 4d 44 29 20 6f 72 20 4d 65 73 73 61 st (MD) or Messa
9560: 67 65 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f ge Authenticatio
9570: 6e 20 43 6f 64 65 20 28 4d 41 43 29 2e 0a 20 2a n Code (MAC).. *
9580: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 . * Returns:. *.
9590: 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 TCL_OK or TCL_ER
95a0: 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ROR. *. * Side e
95b0: 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 ffects:. *.Sets
95c0: 72 65 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 67 result to messag
95d0: 65 20 64 69 67 65 73 74 20 6f 72 20 65 72 72 6f e digest or erro
95e0: 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d r message. *. *-
95f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9630: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
9640: 74 20 4d 64 4f 62 6a 43 6d 64 28 43 6c 69 65 6e t MdObjCmd(Clien
9650: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
9660: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
9670: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
9680: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
9690: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 bjv[]) {. ret
96a0: 75 72 6e 20 44 69 67 65 73 74 4d 61 69 6e 28 54 urn DigestMain(T
96b0: 59 50 45 5f 4d 44 2c 20 69 6e 74 65 72 70 2c 20 YPE_MD, interp,
96c0: 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 0a objc, objv);.}..
96d0: 73 74 61 74 69 63 20 69 6e 74 20 43 4d 41 43 4f static int CMACO
96e0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
96f0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
9700: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
9710: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
9720: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
9730: 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 44 ) {. return D
9740: 69 67 65 73 74 4d 61 69 6e 28 54 59 50 45 5f 43 igestMain(TYPE_C
9750: 4d 41 43 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a MAC, interp, obj
9760: 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 0a 73 74 61 c, objv);.}..sta
9770: 74 69 63 20 69 6e 74 20 48 4d 41 43 4f 62 6a 43 tic int HMACObjC
9780: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
9790: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
97a0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
97b0: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
97c0: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
97d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69 67 65 . return Dige
97e0: 73 74 4d 61 69 6e 28 54 59 50 45 5f 48 4d 41 43 stMain(TYPE_HMAC
97f0: 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 , interp, objc,
9800: 6f 62 6a 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 objv);.}..static
9810: 20 69 6e 74 20 4d 41 43 4f 62 6a 43 6d 64 28 43 int MACObjCmd(C
9820: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
9830: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
9840: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
9850: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
9860: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
9870: 20 72 65 74 75 72 6e 20 44 69 67 65 73 74 4d 61 return DigestMa
9880: 69 6e 28 54 59 50 45 5f 4d 41 43 2c 20 69 6e 74 in(TYPE_MAC, int
9890: 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 erp, objc, objv)
98a0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ;.}../*. *------
98b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
98c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
98d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
98e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
98f0: 0a 20 2a 20 4d 65 73 73 61 67 65 20 44 69 67 65 . * Message Dige
9900: 73 74 20 43 6f 6e 76 65 6e 69 65 6e 63 65 20 43 st Convenience C
9910: 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a 20 2a ommands --. *. *
9920: 09 43 6f 6e 76 65 6e 69 65 6e 63 65 20 63 6f 6d .Convenience com
9930: 6d 61 6e 64 73 20 66 6f 72 20 73 65 6c 65 63 74 mands for select
9940: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 73 message digests
9950: 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a .. *. * Returns:
9960: 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 . *.TCL_OK or TC
9970: 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 L_ERROR. *. * Si
9980: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 de effects:. *.S
9990: 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 6d 65 ets result to me
99a0: 73 73 61 67 65 20 64 69 67 65 73 74 20 6f 72 20 ssage digest or
99b0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a error message. *
99c0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
99d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
99e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
99f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9a00: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 20 23 64 65 66 ------. */. #def
9a10: 69 6e 65 20 76 61 6c 69 64 61 74 65 5f 61 72 67 ine validate_arg
9a20: 63 28 6f 62 6a 63 2c 20 6f 62 6a 76 29 20 7b 20 c(objc, objv) {
9a30: 5c 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 \. if (objc !
9a40: 3d 20 32 29 20 7b 20 5c 0a 09 54 63 6c 5f 57 72 = 2) { \..Tcl_Wr
9a50: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
9a60: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 64 61 74 p, 1, objv, "dat
9a70: 61 22 29 3b 20 5c 0a 09 72 65 74 75 72 6e 20 54 a"); \..return T
9a80: 43 4c 5f 45 52 52 4f 52 3b 20 5c 0a 20 20 20 20 CL_ERROR; \.
9a90: 7d 20 5c 0a 7d 0a 20 0a 69 6e 74 20 4d 44 34 4f } \.}. .int MD4O
9aa0: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
9ab0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
9ac0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
9ad0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
9ae0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
9af0: 29 20 7b 0a 20 20 20 20 76 61 6c 69 64 61 74 65 ) {. validate
9b00: 5f 61 72 67 63 28 6f 62 6a 63 2c 20 6f 62 6a 76 _argc(objc, objv
9b10: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69 );. return Di
9b20: 67 65 73 74 44 61 74 61 48 61 6e 64 6c 65 72 28 gestDataHandler(
9b30: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c interp, objv[1],
9b40: 20 45 56 50 5f 6d 64 34 28 29 2c 20 4e 55 4c 4c EVP_md4(), NULL
9b50: 2c 20 48 45 58 5f 46 4f 52 4d 41 54 20 7c 20 54 , HEX_FORMAT | T
9b60: 59 50 45 5f 4d 44 2c 20 4e 55 4c 4c 2c 20 4e 55 YPE_MD, NULL, NU
9b70: 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 4d 44 35 4f LL);.}..int MD5O
9b80: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
9b90: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
9ba0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
9bb0: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
9bc0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
9bd0: 29 20 7b 0a 20 20 20 20 76 61 6c 69 64 61 74 65 ) {. validate
9be0: 5f 61 72 67 63 28 6f 62 6a 63 2c 20 6f 62 6a 76 _argc(objc, objv
9bf0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69 );. return Di
9c00: 67 65 73 74 44 61 74 61 48 61 6e 64 6c 65 72 28 gestDataHandler(
9c10: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c interp, objv[1],
9c20: 20 45 56 50 5f 6d 64 35 28 29 2c 20 4e 55 4c 4c EVP_md5(), NULL
9c30: 2c 20 48 45 58 5f 46 4f 52 4d 41 54 20 7c 20 54 , HEX_FORMAT | T
9c40: 59 50 45 5f 4d 44 2c 20 4e 55 4c 4c 2c 20 4e 55 YPE_MD, NULL, NU
9c50: 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 53 48 41 31 LL);.}..int SHA1
9c60: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
9c70: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
9c80: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
9c90: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
9ca0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
9cb0: 5d 29 20 7b 0a 20 20 20 20 76 61 6c 69 64 61 74 ]) {. validat
9cc0: 65 5f 61 72 67 63 28 6f 62 6a 63 2c 20 6f 62 6a e_argc(objc, obj
9cd0: 76 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 44 v);. return D
9ce0: 69 67 65 73 74 44 61 74 61 48 61 6e 64 6c 65 72 igestDataHandler
9cf0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d (interp, objv[1]
9d00: 2c 20 45 56 50 5f 73 68 61 31 28 29 2c 20 4e 55 , EVP_sha1(), NU
9d10: 4c 4c 2c 20 48 45 58 5f 46 4f 52 4d 41 54 20 7c LL, HEX_FORMAT |
9d20: 20 54 59 50 45 5f 4d 44 2c 20 4e 55 4c 4c 2c 20 TYPE_MD, NULL,
9d30: 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 53 48 NULL);.}..int SH
9d40: 41 32 35 36 4f 62 6a 43 6d 64 28 43 6c 69 65 6e A256ObjCmd(Clien
9d50: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
9d60: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
9d70: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
9d80: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
9d90: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 76 61 6c bjv[]) {. val
9da0: 69 64 61 74 65 5f 61 72 67 63 28 6f 62 6a 63 2c idate_argc(objc,
9db0: 20 6f 62 6a 76 29 3b 0a 20 20 20 20 72 65 74 75 objv);. retu
9dc0: 72 6e 20 44 69 67 65 73 74 44 61 74 61 48 61 6e rn DigestDataHan
9dd0: 64 6c 65 72 28 69 6e 74 65 72 70 2c 20 6f 62 6a dler(interp, obj
9de0: 76 5b 31 5d 2c 20 45 56 50 5f 73 68 61 32 35 36 v[1], EVP_sha256
9df0: 28 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f 46 4f (), NULL, HEX_FO
9e00: 52 4d 41 54 20 7c 20 54 59 50 45 5f 4d 44 2c 20 RMAT | TYPE_MD,
9e10: 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a NULL, NULL);.}..
9e20: 69 6e 74 20 53 48 41 35 31 32 4f 62 6a 43 6d 64 int SHA512ObjCmd
9e30: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
9e40: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
9e50: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
9e60: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
9e70: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
9e80: 20 20 20 76 61 6c 69 64 61 74 65 5f 61 72 67 63 validate_argc
9e90: 28 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 20 20 (objc, objv);.
9ea0: 20 20 72 65 74 75 72 6e 20 44 69 67 65 73 74 44 return DigestD
9eb0: 61 74 61 48 61 6e 64 6c 65 72 28 69 6e 74 65 72 ataHandler(inter
9ec0: 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 45 56 50 5f p, objv[1], EVP_
9ed0: 73 68 61 35 31 32 28 29 2c 20 4e 55 4c 4c 2c 20 sha512(), NULL,
9ee0: 48 45 58 5f 46 4f 52 4d 41 54 20 7c 20 54 59 50 HEX_FORMAT | TYP
9ef0: 45 5f 4d 44 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c E_MD, NULL, NULL
9f00: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d );.}../*. *-----
9f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
9f50: 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73 74 43 *. * Tls_DigestC
9f60: 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a 20 2a ommands --. *. *
9f70: 09 43 72 65 61 74 65 20 64 69 67 65 73 74 20 63 .Create digest c
9f80: 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 65 ommands. *. * Re
9f90: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b turns:. *.TCL_OK
9fa0: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a or TCL_ERROR. *
9fb0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
9fc0: 3a 0a 20 2a 09 43 72 65 61 74 65 73 20 63 6f 6d :. *.Creates com
9fd0: 6d 61 6e 64 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d mands. *. *-----
9fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
a020: 2a 2f 0a 69 6e 74 20 54 6c 73 5f 44 69 67 65 73 */.int Tls_Diges
a030: 74 43 6f 6d 6d 61 6e 64 73 28 54 63 6c 5f 49 6e tCommands(Tcl_In
a040: 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a terp *interp) {.
a050: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
a060: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
a070: 20 22 74 6c 73 3a 3a 64 69 67 65 73 74 22 2c 20 "tls::digest",
a080: 4d 64 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e MdObjCmd, (Clien
a090: 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
a0a0: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
a0b0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
a0c0: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
a0d0: 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 64 interp, "tls::md
a0e0: 22 2c 20 4d 64 4f 62 6a 43 6d 64 2c 20 28 43 6c ", MdObjCmd, (Cl
a0f0: 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
a100: 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
a110: 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
a120: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
a130: 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
a140: 3a 63 6d 61 63 22 2c 20 43 4d 41 43 4f 62 6a 43 :cmac", CMACObjC
a150: 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
a160: 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
a170: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
a180: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
a190: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
a1a0: 2c 20 22 74 6c 73 3a 3a 68 6d 61 63 22 2c 20 48 , "tls::hmac", H
a1b0: 4d 41 43 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 MACObjCmd, (Clie
a1c0: 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f ntData) 0, (Tcl_
a1d0: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
a1e0: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
a1f0: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
a200: 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d (interp, "tls::m
a210: 61 63 22 2c 20 4d 41 43 4f 62 6a 43 6d 64 2c 20 ac", MACObjCmd,
a220: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 (ClientData) 0,
a230: 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
a240: 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
a250: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
a260: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
a270: 6c 73 3a 3a 6d 64 34 22 2c 20 4d 44 34 4f 62 6a ls::md4", MD4Obj
a280: 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
a290: 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ) 0, (Tcl_CmdDel
a2a0: 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
a2b0: 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
a2c0: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
a2d0: 70 2c 20 22 74 6c 73 3a 3a 6d 64 35 22 2c 20 4d p, "tls::md5", M
a2e0: 44 35 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e D5ObjCmd, (Clien
a2f0: 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
a300: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
a310: 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
a320: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
a330: 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 68 interp, "tls::sh
a340: 61 31 22 2c 20 53 48 41 31 4f 62 6a 43 6d 64 2c a1", SHA1ObjCmd,
a350: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
a360: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
a370: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
a380: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
a390: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
a3a0: 74 6c 73 3a 3a 73 68 61 32 35 36 22 2c 20 53 48 tls::sha256", SH
a3b0: 41 32 35 36 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 A256ObjCmd, (Cli
a3c0: 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c entData) 0, (Tcl
a3d0: 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
a3e0: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c ) NULL);. Tcl
a3f0: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
a400: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
a410: 73 68 61 35 31 32 22 2c 20 53 48 41 35 31 32 4f sha512", SHA512O
a420: 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
a430: 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
a440: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
a450: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
a460: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
a470: 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e 73 74 61 erp, "tls::unsta
a480: 63 6b 22 2c 20 44 69 67 65 73 74 55 6e 73 74 61 ck", DigestUnsta
a490: 63 6b 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e ckObjCmd, (Clien
a4a0: 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
a4b0: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
a4c0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 72 65 74 75 72 NULL);. retur
a4d0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a n TCL_OK;.}..