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 4d 65 o calculate a Me
0070: 73 73 61 67 65 20 44 69 67 65 73 74 20 28 4d 44 ssage Digest (MD
0080: 29 20 6f 72 20 61 20 4d 65 73 73 61 67 65 0a 20 ) or a Message.
0090: 2a 20 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e * Authentication
00a0: 20 43 6f 64 65 20 28 4d 41 43 29 2e 0a 20 2a 0a Code (MAC).. *.
00b0: 20 2a 20 43 6f 70 79 72 69 67 68 74 20 28 43 29 * Copyright (C)
00c0: 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 61 2023 Brian O'Ha
00d0: 67 61 6e 0a 20 2a 0a 20 2a 2f 0a 0a 23 69 6e 63 gan. *. */..#inc
00e0: 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 22 0a lude "tlsInt.h".
00f0: 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f 70 74 #include "tclOpt
0100: 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 74 s.h".#include <t
0110: 63 6c 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c cl.h>.#include <
0120: 73 74 64 69 6f 2e 68 3e 0a 23 69 6e 63 6c 75 64 stdio.h>.#includ
0130: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e e <string.h>.#in
0140: 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 65 clude <openssl/e
0150: 76 70 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c vp.h>.#include <
0160: 6f 70 65 6e 73 73 6c 2f 63 6d 61 63 2e 68 3e 0a openssl/cmac.h>.
0170: 23 69 6e 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 #include <openss
0180: 6c 2f 68 6d 61 63 2e 68 3e 0a 0a 2f 2a 20 43 6f l/hmac.h>../* Co
0190: 6e 73 74 61 6e 74 73 20 2a 2f 0a 63 6f 6e 73 74 nstants */.const
01a0: 20 63 68 61 72 20 2a 68 65 78 20 3d 20 22 30 31 char *hex = "01
01b0: 32 33 34 35 36 37 38 39 61 62 63 64 65 66 22 3b 23456789abcdef";
01c0: 0a 0a 2f 2a 20 4d 61 63 72 6f 73 20 2a 2f 0a 23 ../* Macros */.#
01d0: 64 65 66 69 6e 65 20 42 55 46 46 45 52 5f 53 49 define BUFFER_SI
01e0: 5a 45 09 36 35 35 33 36 0a 23 64 65 66 69 6e 65 ZE.65536.#define
01f0: 20 43 48 41 4e 5f 45 4f 46 09 30 78 31 30 0a 23 CHAN_EOF.0x10.#
0200: 64 65 66 69 6e 65 20 52 45 41 44 5f 44 45 4c 41 define READ_DELA
0210: 59 09 35 0a 0a 2f 2a 20 44 69 67 65 73 74 20 66 Y.5../* Digest f
0220: 6f 72 6d 61 74 20 28 62 69 74 73 20 30 2d 33 29 ormat (bits 0-3)
0230: 20 61 6e 64 20 6f 70 65 72 61 74 69 6f 6e 20 28 and operation (
0240: 62 69 74 73 20 34 2d 37 29 20 2a 2f 0a 23 64 65 bits 4-7) */.#de
0250: 66 69 6e 65 20 42 49 4e 5f 46 4f 52 4d 41 54 09 fine BIN_FORMAT.
0260: 30 78 30 31 0a 23 64 65 66 69 6e 65 20 48 45 58 0x01.#define HEX
0270: 5f 46 4f 52 4d 41 54 09 30 78 30 32 0a 2f 2a 23 _FORMAT.0x02./*#
0280: 64 65 66 69 6e 65 20 42 36 34 5f 46 4f 52 4d 41 define B64_FORMA
0290: 54 09 30 78 30 34 2a 2f 0a 23 64 65 66 69 6e 65 T.0x04*/.#define
02a0: 20 49 53 5f 58 4f 46 09 09 30 78 30 38 0a 23 64 IS_XOF..0x08.#d
02b0: 65 66 69 6e 65 20 54 59 50 45 5f 4d 44 09 09 30 efine TYPE_MD..0
02c0: 78 31 30 0a 23 64 65 66 69 6e 65 20 54 59 50 45 x10.#define TYPE
02d0: 5f 48 4d 41 43 09 30 78 32 30 0a 23 64 65 66 69 _HMAC.0x20.#defi
02e0: 6e 65 20 54 59 50 45 5f 43 4d 41 43 09 30 78 34 ne TYPE_CMAC.0x4
02f0: 30 0a 23 64 65 66 69 6e 65 20 54 59 50 45 5f 4d 0.#define TYPE_M
0300: 41 43 09 30 78 38 30 0a 0a 2f 2a 2a 2a 2a 2a 2a AC.0x80../******
0310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0320: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0330: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a *************/..
0350: 2f 2a 0a 20 2a 20 54 68 69 73 20 73 74 72 75 63 /*. * This struc
0360: 74 75 72 65 20 64 65 66 69 6e 65 73 20 74 68 65 ture defines the
0370: 20 70 65 72 2d 69 6e 73 74 61 6e 63 65 20 73 74 per-instance st
0380: 61 74 65 20 6f 66 20 61 20 64 69 67 65 73 74 20 ate of a digest
0390: 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 2a 2f 0a 74 operation.. */.t
03a0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 44 69 ypedef struct Di
03b0: 67 65 73 74 53 74 61 74 65 20 7b 0a 09 54 63 6c gestState {..Tcl
03c0: 5f 43 68 61 6e 6e 65 6c 20 73 65 6c 66 3b 09 2f _Channel self;./
03d0: 2a 20 54 68 69 73 20 73 6f 63 6b 65 74 20 63 68 * This socket ch
03e0: 61 6e 6e 65 6c 20 2a 2f 0a 09 54 63 6c 5f 54 69 annel */..Tcl_Ti
03f0: 6d 65 72 54 6f 6b 65 6e 20 74 69 6d 65 72 3b 09 merToken timer;.
0400: 2f 2a 20 54 69 6d 65 72 20 66 6f 72 20 72 65 61 /* Timer for rea
0410: 64 20 65 76 65 6e 74 73 20 2a 2f 0a 0a 09 69 6e d events */...in
0420: 74 20 66 6c 61 67 73 3b 09 09 2f 2a 20 43 68 61 t flags;../* Cha
0430: 6e 20 63 6f 6e 66 69 67 20 66 6c 61 67 73 20 2a n config flags *
0440: 2f 0a 09 69 6e 74 20 77 61 74 63 68 4d 61 73 6b /..int watchMask
0450: 3b 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 57 61 ;../* Current Wa
0460: 74 63 68 50 72 6f 63 20 6d 61 73 6b 20 2a 2f 0a tchProc mask */.
0470: 09 69 6e 74 20 6d 6f 64 65 3b 09 09 2f 2a 20 43 .int mode;../* C
0480: 75 72 72 65 6e 74 20 6d 6f 64 65 20 6f 66 20 70 urrent mode of p
0490: 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20 2a 2f arent channel */
04a0: 0a 09 69 6e 74 20 66 6f 72 6d 61 74 3b 09 09 2f ..int format;../
04b0: 2a 20 44 69 67 65 73 74 20 66 6f 72 6d 61 74 20 * Digest format
04c0: 61 6e 64 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f and operation */
04d0: 0a 09 69 6e 74 20 6c 65 6e 67 74 68 3b 09 09 2f ..int length;../
04e0: 2a 20 44 69 67 65 73 74 20 6c 65 6e 67 74 68 20 * Digest length
04f0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 09 54 63 in bytes */...Tc
0500: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
0510: 3b 09 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 ;./* Current int
0520: 65 72 70 72 65 74 65 72 20 2a 2f 0a 09 45 56 50 erpreter */..EVP
0530: 5f 4d 44 5f 43 54 58 20 2a 63 74 78 3b 09 2f 2a _MD_CTX *ctx;./*
0540: 20 4d 44 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 09 MD Context */..
0550: 48 4d 41 43 5f 43 54 58 20 2a 68 63 74 78 3b 09 HMAC_CTX *hctx;.
0560: 09 2f 2a 20 48 4d 41 43 20 63 6f 6e 74 65 78 74 ./* HMAC context
0570: 20 2a 2f 0a 09 43 4d 41 43 5f 43 54 58 20 2a 63 */..CMAC_CTX *c
0580: 63 74 78 3b 09 09 2f 2a 20 43 4d 41 43 20 63 6f ctx;../* CMAC co
0590: 6e 74 65 78 74 20 2a 2f 0a 09 54 63 6c 5f 43 6f ntext */..Tcl_Co
05a0: 6d 6d 61 6e 64 20 74 6f 6b 65 6e 3b 09 2f 2a 20 mmand token;./*
05b0: 43 6f 6d 6d 61 6e 64 20 74 6f 6b 65 6e 20 2a 2f Command token */
05c0: 0a 7d 20 44 69 67 65 73 74 53 74 61 74 65 3b 0a .} DigestState;.
05d0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
05e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 0a 20 2a 20 ---------. *. *
0620: 44 69 67 65 73 74 53 74 61 74 65 4e 65 77 20 2d DigestStateNew -
0630: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e -. *. *.This fun
0640: 63 74 69 6f 6e 20 63 72 65 61 74 65 73 20 61 20 ction creates a
0650: 70 65 72 2d 69 6e 73 74 61 6e 63 65 20 73 74 61 per-instance sta
0660: 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 te data structur
0670: 65 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a e. *. * Returns:
0680: 0a 20 2a 09 44 69 67 65 73 74 20 73 74 72 75 63 . *.Digest struc
0690: 74 75 72 65 20 70 6f 69 6e 74 65 72 0a 20 2a 0a ture pointer. *.
06a0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
06b0: 0a 20 2a 09 43 72 65 61 74 65 73 20 73 74 72 75 . *.Creates stru
06c0: 63 74 75 72 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d cture. *. *-----
06d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
06e0: 2d 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 0a 20 --------------.
0710: 2a 2f 0a 44 69 67 65 73 74 53 74 61 74 65 20 2a */.DigestState *
0720: 44 69 67 65 73 74 53 74 61 74 65 4e 65 77 28 54 DigestStateNew(T
0730: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
0740: 70 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c 20 69 p, int format, i
0750: 6e 74 20 6c 65 6e 67 74 68 29 20 7b 0a 20 20 20 nt length) {.
0760: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 DigestState *st
0770: 61 74 65 50 74 72 3b 0a 0a 20 20 20 20 73 74 61 atePtr;.. sta
0780: 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 tePtr = (DigestS
0790: 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 tate *) ckalloc(
07a0: 28 75 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f (unsigned) sizeo
07b0: 66 28 44 69 67 65 73 74 53 74 61 74 65 29 29 3b f(DigestState));
07c0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
07d0: 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6d 65 r != NULL) {..me
07e0: 6d 73 65 74 28 73 74 61 74 65 50 74 72 2c 20 30 mset(statePtr, 0
07f0: 2c 20 73 69 7a 65 6f 66 28 44 69 67 65 73 74 53 , sizeof(DigestS
0800: 74 61 74 65 29 29 3b 0a 09 73 74 61 74 65 50 74 tate));..statePt
0810: 72 2d 3e 73 65 6c 66 09 3d 20 4e 55 4c 4c 3b 09 r->self.= NULL;.
0820: 09 2f 2a 20 54 68 69 73 20 73 6f 63 6b 65 74 20 ./* This socket
0830: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 09 73 74 61 74 channel */..stat
0840: 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 ePtr->timer = NU
0850: 4c 4c 3b 09 09 2f 2a 20 54 69 6d 65 72 20 74 6f LL;../* Timer to
0860: 20 66 6c 75 73 68 20 64 61 74 61 20 2a 2f 0a 09 flush data */..
0870: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
0880: 3d 20 30 3b 09 09 2f 2a 20 43 68 61 6e 20 63 6f = 0;../* Chan co
0890: 6e 66 69 67 20 66 6c 61 67 73 20 2a 2f 0a 09 73 nfig flags */..s
08a0: 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 tatePtr->watchMa
08b0: 73 6b 20 3d 20 30 3b 09 2f 2a 20 43 75 72 72 65 sk = 0;./* Curre
08c0: 6e 74 20 57 61 74 63 68 50 72 6f 63 20 6d 61 73 nt WatchProc mas
08d0: 6b 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e k */..statePtr->
08e0: 6d 6f 64 65 09 3d 20 30 3b 09 09 2f 2a 20 43 75 mode.= 0;../* Cu
08f0: 72 72 65 6e 74 20 6d 6f 64 65 20 6f 66 20 70 61 rrent mode of pa
0900: 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a rent channel */.
0910: 09 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 .statePtr->forma
0920: 74 20 3d 20 66 6f 72 6d 61 74 3b 09 2f 2a 20 44 t = format;./* D
0930: 69 67 65 73 74 20 66 6f 72 6d 61 74 20 61 6e 64 igest format and
0940: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 09 73 operation */..s
0950: 74 61 74 65 50 74 72 2d 3e 6c 65 6e 67 74 68 20 tatePtr->length
0960: 3d 20 6c 65 6e 67 74 68 3b 09 2f 2a 20 44 69 67 = length;./* Dig
0970: 65 73 74 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 est length in by
0980: 74 65 73 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 tes */..statePtr
0990: 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 ->interp = inter
09a0: 70 3b 09 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e p;./* Current in
09b0: 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 09 73 74 terpreter */..st
09c0: 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 atePtr->ctx = NU
09d0: 4c 4c 3b 09 09 2f 2a 20 4d 44 20 43 6f 6e 74 65 LL;../* MD Conte
09e0: 78 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d xt */..statePtr-
09f0: 3e 68 63 74 78 20 3d 20 4e 55 4c 4c 3b 09 09 2f >hctx = NULL;../
0a00: 2a 20 48 4d 41 43 20 43 6f 6e 74 65 78 74 20 2a * HMAC Context *
0a10: 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 63 74 /..statePtr->cct
0a20: 78 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 43 4d x = NULL;../* CM
0a30: 41 43 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 AC Context */..s
0a40: 74 61 74 65 50 74 72 2d 3e 74 6f 6b 65 6e 20 3d tatePtr->token =
0a50: 20 4e 55 4c 4c 3b 09 09 2f 2a 20 43 6f 6d 6d 61 NULL;../* Comma
0a60: 6e 64 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 nd token */.
0a70: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 73 74 61 }. return sta
0a80: 74 65 50 74 72 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d tePtr;.}../*. *-
0a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ad0: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 53 --. *. * DigestS
0ae0: 74 61 74 65 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 tateFree --. *.
0af0: 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 *.This function
0b00: 64 65 6c 65 74 65 73 20 61 20 64 69 67 65 73 74 deletes a digest
0b10: 20 73 74 61 74 65 20 73 74 72 75 63 74 75 72 65 state structure
0b20: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a . *. * Returns:.
0b30: 20 2a 09 4e 6f 74 68 69 6e 67 0a 20 2a 0a 20 2a *.Nothing. *. *
0b40: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
0b50: 2a 09 52 65 6d 6f 76 65 73 20 73 74 72 75 63 74 *.Removes struct
0b60: 75 72 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ure. *. *-------
0b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
0bb0: 0a 76 6f 69 64 20 44 69 67 65 73 74 53 74 61 74 .void DigestStat
0bc0: 65 46 72 65 65 28 44 69 67 65 73 74 53 74 61 74 eFree(DigestStat
0bd0: 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 e *statePtr) {.
0be0: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 20 if (statePtr
0bf0: 3d 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 == (DigestState
0c00: 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 *) NULL) {..retu
0c10: 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f rn;. }.. /
0c20: 2a 20 52 65 6d 6f 76 65 20 70 65 6e 64 69 6e 67 * Remove pending
0c30: 20 74 69 6d 65 72 20 2a 2f 0a 20 20 20 20 69 66 timer */. if
0c40: 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 (statePtr->time
0c50: 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 r != (Tcl_TimerT
0c60: 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 oken) NULL) {..T
0c70: 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 cl_DeleteTimerHa
0c80: 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e ndler(statePtr->
0c90: 74 69 6d 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 timer);. }..
0ca0: 20 20 20 2f 2a 20 46 72 65 65 20 63 6f 6e 74 65 /* Free conte
0cb0: 78 74 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f xt structures */
0cc0: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
0cd0: 72 2d 3e 63 74 78 20 21 3d 20 28 45 56 50 5f 4d r->ctx != (EVP_M
0ce0: 44 5f 43 54 58 20 2a 29 20 4e 55 4c 4c 29 20 7b D_CTX *) NULL) {
0cf0: 0a 09 45 56 50 5f 4d 44 5f 43 54 58 5f 66 72 65 ..EVP_MD_CTX_fre
0d00: 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 e(statePtr->ctx)
0d10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
0d20: 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 20 21 statePtr->hctx !
0d30: 3d 20 28 48 4d 41 43 5f 43 54 58 20 2a 29 20 4e = (HMAC_CTX *) N
0d40: 55 4c 4c 29 20 7b 0a 09 48 4d 41 43 5f 43 54 58 ULL) {..HMAC_CTX
0d50: 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e _free(statePtr->
0d60: 68 63 74 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 hctx);. }.
0d70: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 if (statePtr->c
0d80: 63 74 78 20 21 3d 20 28 43 4d 41 43 5f 43 54 58 ctx != (CMAC_CTX
0d90: 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 43 4d 41 *) NULL) {..CMA
0da0: 43 5f 43 54 58 5f 66 72 65 65 28 73 74 61 74 65 C_CTX_free(state
0db0: 50 74 72 2d 3e 63 63 74 78 29 3b 0a 20 20 20 20 Ptr->cctx);.
0dc0: 7d 0a 20 20 20 20 63 6b 66 72 65 65 28 73 74 61 }. ckfree(sta
0dd0: 74 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a tePtr);.}../****
0de0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0df0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0e00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0e10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f ***************/
0e20: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
0e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
0e70: 20 44 69 67 65 73 74 49 6e 69 74 69 61 6c 69 7a DigestInitializ
0e80: 65 20 2d 2d 0a 20 2a 0a 20 2a 09 49 6e 69 74 69 e --. *. *.Initi
0e90: 61 6c 69 7a 65 20 61 20 68 61 73 68 20 66 75 6e alize a hash fun
0ea0: 63 74 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65 74 75 ction. *. * Retu
0eb0: 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 rns:. *.TCL_OK i
0ec0: 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 f successful or
0ed0: 54 43 4c 5f 45 52 52 4f 52 20 66 6f 72 20 66 61 TCL_ERROR for fa
0ee0: 69 6c 75 72 65 20 77 69 74 68 20 72 65 73 75 6c ilure with resul
0ef0: 74 20 73 65 74 0a 20 2a 09 74 6f 20 65 72 72 6f t set. *.to erro
0f00: 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a r message.. *. *
0f10: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
0f20: 2a 09 4e 6f 20 72 65 73 75 6c 74 20 6f 72 20 65 *.No result or e
0f30: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a rror message. *.
0f40: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f80: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 -----. */.int Di
0f90: 67 65 73 74 49 6e 69 74 69 61 6c 69 7a 65 28 54 gestInitialize(T
0fa0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
0fb0: 70 2c 20 44 69 67 65 73 74 53 74 61 74 65 20 2a p, DigestState *
0fc0: 73 74 61 74 65 50 74 72 2c 20 54 63 6c 5f 4f 62 statePtr, Tcl_Ob
0fd0: 6a 20 2a 64 69 67 65 73 74 4f 62 6a 2c 0a 09 54 j *digestObj,..T
0fe0: 63 6c 5f 4f 62 6a 20 2a 63 69 70 68 65 72 4f 62 cl_Obj *cipherOb
0ff0: 6a 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f j, Tcl_Obj *keyO
1000: 62 6a 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6d 61 63 bj, Tcl_Obj *mac
1010: 4f 62 6a 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 Obj) {. int r
1020: 65 73 20 3d 20 30 2c 20 74 79 70 65 20 3d 20 73 es = 0, type = s
1030: 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 tatePtr->format
1040: 26 20 30 78 46 46 30 3b 0a 20 20 20 20 63 6f 6e & 0xFF0;. con
1050: 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 20 3d 20 st EVP_MD *md =
1060: 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 NULL;. const
1070: 45 56 50 5f 43 49 50 48 45 52 20 2a 63 69 70 68 EVP_CIPHER *ciph
1080: 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 er = NULL;. c
1090: 6f 6e 73 74 20 76 6f 69 64 20 2a 6b 65 79 20 3d onst void *key =
10a0: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 NULL;. Tcl_S
10b0: 69 7a 65 20 6b 65 79 5f 6c 65 6e 20 3d 20 30 3b ize key_len = 0;
10c0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
10d0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a alled");.. /*
10e0: 20 47 65 74 20 64 69 67 65 73 74 20 2a 2f 0a 20 Get digest */.
10f0: 20 20 20 69 66 20 28 74 79 70 65 20 21 3d 20 54 if (type != T
1100: 59 50 45 5f 43 4d 41 43 29 20 7b 0a 09 6d 64 20 YPE_CMAC) {..md
1110: 3d 20 55 74 69 6c 5f 47 65 74 44 69 67 65 73 74 = Util_GetDigest
1120: 28 69 6e 74 65 72 70 2c 20 64 69 67 65 73 74 4f (interp, digestO
1130: 62 6a 2c 20 74 79 70 65 20 21 3d 20 54 59 50 45 bj, type != TYPE
1140: 5f 43 4d 41 43 29 3b 0a 09 69 66 20 28 6d 64 20 _CMAC);..if (md
1150: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 != NULL) {..
1160: 2f 2a 20 49 73 20 58 4f 46 20 2a 2f 0a 09 20 20 /* Is XOF */..
1170: 20 20 69 66 20 28 45 56 50 5f 4d 44 5f 66 6c 61 if (EVP_MD_fla
1180: 67 73 28 6d 64 29 20 26 20 45 56 50 5f 4d 44 5f gs(md) & EVP_MD_
1190: 46 4c 41 47 5f 58 4f 46 29 20 7b 0a 09 09 73 74 FLAG_XOF) {...st
11a0: 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 3d atePtr->format =
11b0: 20 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 statePtr->forma
11c0: 74 20 7c 20 49 53 5f 58 4f 46 3b 0a 09 20 20 20 t | IS_XOF;..
11d0: 20 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 }..} else {..
11e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
11f0: 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 OR;..}. }..
1200: 20 20 2f 2a 20 47 65 74 20 63 69 70 68 65 72 20 /* Get cipher
1210: 2a 2f 0a 20 20 20 20 69 66 20 28 74 79 70 65 20 */. if (type
1220: 3d 3d 20 54 59 50 45 5f 43 4d 41 43 29 20 7b 0a == TYPE_CMAC) {.
1230: 09 63 69 70 68 65 72 20 3d 20 55 74 69 6c 5f 47 .cipher = Util_G
1240: 65 74 43 69 70 68 65 72 28 69 6e 74 65 72 70 2c etCipher(interp,
1250: 20 63 69 70 68 65 72 4f 62 6a 2c 20 74 79 70 65 cipherObj, type
1260: 20 3d 3d 20 54 59 50 45 5f 43 4d 41 43 29 3b 0a == TYPE_CMAC);.
1270: 09 69 66 20 28 63 69 70 68 65 72 20 3d 3d 20 4e .if (cipher == N
1280: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65 74 75 ULL) {.. retu
1290: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
12a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 . }.. /* G
12b0: 65 74 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 et key */. if
12c0: 20 28 74 79 70 65 20 21 3d 20 54 59 50 45 5f 4d (type != TYPE_M
12d0: 44 29 20 7b 0a 09 6b 65 79 20 3d 20 28 63 6f 6e D) {..key = (con
12e0: 73 74 20 76 6f 69 64 20 2a 29 20 55 74 69 6c 5f st void *) Util_
12f0: 47 65 74 4b 65 79 28 69 6e 74 65 72 70 2c 20 6b GetKey(interp, k
1300: 65 79 4f 62 6a 2c 20 26 6b 65 79 5f 6c 65 6e 2c eyObj, &key_len,
1310: 20 22 6b 65 79 22 2c 20 30 2c 20 74 79 70 65 20 "key", 0, type
1320: 21 3d 20 54 59 50 45 5f 4d 44 29 3b 0a 09 69 66 != TYPE_MD);..if
1330: 20 28 6b 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b (key == NULL) {
1340: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c .. return TCL
1350: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d _ERROR;..}. }
1360: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 .. /* Create
1370: 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 20 20 contexts */.
1380: 73 77 69 74 63 68 28 74 79 70 65 29 20 7b 0a 20 switch(type) {.
1390: 20 20 20 63 61 73 65 20 54 59 50 45 5f 4d 44 3a case TYPE_MD:
13a0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 ..statePtr->ctx
13b0: 3d 20 45 56 50 5f 4d 44 5f 43 54 58 5f 6e 65 77 = EVP_MD_CTX_new
13c0: 28 29 3b 0a 09 72 65 73 20 3d 20 28 73 74 61 74 ();..res = (stat
13d0: 65 50 74 72 2d 3e 63 74 78 20 21 3d 20 4e 55 4c ePtr->ctx != NUL
13e0: 4c 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 L);..break;.
13f0: 63 61 73 65 20 54 59 50 45 5f 48 4d 41 43 3a 0a case TYPE_HMAC:.
1400: 09 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 20 .statePtr->hctx
1410: 3d 20 48 4d 41 43 5f 43 54 58 5f 6e 65 77 28 29 = HMAC_CTX_new()
1420: 3b 0a 09 72 65 73 20 3d 20 28 73 74 61 74 65 50 ;..res = (stateP
1430: 74 72 2d 3e 68 63 74 78 20 21 3d 20 4e 55 4c 4c tr->hctx != NULL
1440: 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 );..break;. c
1450: 61 73 65 20 54 59 50 45 5f 43 4d 41 43 3a 0a 09 ase TYPE_CMAC:..
1460: 73 74 61 74 65 50 74 72 2d 3e 63 63 74 78 20 3d statePtr->cctx =
1470: 20 43 4d 41 43 5f 43 54 58 5f 6e 65 77 28 29 3b CMAC_CTX_new();
1480: 0a 09 72 65 73 20 3d 20 28 73 74 61 74 65 50 74 ..res = (statePt
1490: 72 2d 3e 63 63 74 78 20 21 3d 20 4e 55 4c 4c 29 r->cctx != NULL)
14a0: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a ;..break;. }.
14b0: 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b . if (!res) {
14c0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
14d0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 43 72 65 61 lt(interp, "Crea
14e0: 74 65 20 63 6f 6e 74 65 78 74 20 66 61 69 6c 65 te context faile
14f0: 64 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c d", (char *) NUL
1500: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
1510: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
1520: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 /* Initialize
1530: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f hash function */
1540: 0a 20 20 20 20 73 77 69 74 63 68 28 74 79 70 65 . switch(type
1550: 29 20 7b 0a 20 20 20 20 63 61 73 65 20 54 59 50 ) {. case TYP
1560: 45 5f 4d 44 3a 0a 09 72 65 73 20 3d 20 45 56 50 E_MD:..res = EVP
1570: 5f 44 69 67 65 73 74 49 6e 69 74 5f 65 78 28 73 _DigestInit_ex(s
1580: 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 6d 64 tatePtr->ctx, md
1590: 2c 20 4e 55 4c 4c 29 3b 0a 09 62 72 65 61 6b 3b , NULL);..break;
15a0: 0a 20 20 20 20 63 61 73 65 20 54 59 50 45 5f 48 . case TYPE_H
15b0: 4d 41 43 3a 0a 09 72 65 73 20 3d 20 48 4d 41 43 MAC:..res = HMAC
15c0: 5f 49 6e 69 74 5f 65 78 28 73 74 61 74 65 50 74 _Init_ex(statePt
15d0: 72 2d 3e 68 63 74 78 2c 20 6b 65 79 2c 20 28 69 r->hctx, key, (i
15e0: 6e 74 29 20 6b 65 79 5f 6c 65 6e 2c 20 6d 64 2c nt) key_len, md,
15f0: 20 4e 55 4c 4c 29 3b 0a 09 62 72 65 61 6b 3b 0a NULL);..break;.
1600: 20 20 20 20 63 61 73 65 20 54 59 50 45 5f 43 4d case TYPE_CM
1610: 41 43 3a 0a 09 72 65 73 20 3d 20 43 4d 41 43 5f AC:..res = CMAC_
1620: 49 6e 69 74 28 73 74 61 74 65 50 74 72 2d 3e 63 Init(statePtr->c
1630: 63 74 78 2c 20 6b 65 79 2c 20 28 69 6e 74 29 20 ctx, key, (int)
1640: 6b 65 79 5f 6c 65 6e 2c 20 63 69 70 68 65 72 2c key_len, cipher,
1650: 20 4e 55 4c 4c 29 3b 0a 09 62 72 65 61 6b 3b 0a NULL);..break;.
1660: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 21 }.. if (!
1670: 72 65 73 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 res) {..Tcl_Appe
1680: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
1690: 20 22 49 6e 69 74 69 61 6c 69 7a 65 20 66 61 69 "Initialize fai
16a0: 6c 65 64 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f led: ", GET_ERR_
16b0: 52 45 41 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 REASON(), (char
16c0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 *) NULL);..retur
16d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
16e0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 }. return TC
16f0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d L_OK;.}../*. *--
1700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1740: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 55 70 -. *. * DigestUp
1750: 64 61 74 65 20 2d 2d 0a 20 2a 0a 20 2a 09 55 70 date --. *. *.Up
1760: 64 61 74 65 20 61 20 68 61 73 68 20 66 75 6e 63 date a hash func
1770: 74 69 6f 6e 20 77 69 74 68 20 64 61 74 61 0a 20 tion with data.
1780: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a *. * Returns:. *
1790: 09 54 43 4c 5f 4f 4b 20 69 66 20 73 75 63 63 65 .TCL_OK if succe
17a0: 73 73 66 75 6c 20 6f 72 20 54 43 4c 5f 45 52 52 ssful or TCL_ERR
17b0: 4f 52 20 66 6f 72 20 66 61 69 6c 75 72 65 20 77 OR for failure w
17c0: 69 74 68 20 72 65 73 75 6c 74 20 73 65 74 0a 20 ith result set.
17d0: 2a 09 74 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 *.to error messa
17e0: 67 65 20 69 66 20 64 6f 5f 72 65 73 75 6c 74 20 ge if do_result
17f0: 69 73 20 74 72 75 65 2e 0a 20 2a 0a 20 2a 20 53 is true.. *. * S
1800: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
1810: 41 64 64 73 20 62 75 66 20 64 61 74 61 20 74 6f Adds buf data to
1820: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 6f hash function o
1830: 72 20 73 65 74 73 20 72 65 73 75 6c 74 20 74 6f r sets result to
1840: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 error message.
1850: 2a 0a 20 2a 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 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 -------. */.int
18a0: 44 69 67 65 73 74 55 70 64 61 74 65 28 44 69 67 DigestUpdate(Dig
18b0: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 estState *stateP
18c0: 74 72 2c 20 63 68 61 72 20 2a 62 75 66 2c 20 54 tr, char *buf, T
18d0: 63 6c 5f 53 69 7a 65 20 72 65 61 64 2c 20 69 6e cl_Size read, in
18e0: 74 20 64 6f 5f 72 65 73 75 6c 74 29 20 7b 0a 20 t do_result) {.
18f0: 20 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a int res = 0;.
1900: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
1910: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 lled");.. /*
1920: 55 70 64 61 74 65 20 68 61 73 68 20 66 75 6e 63 Update hash func
1930: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 73 77 69 74 tion */. swit
1940: 63 68 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 ch(statePtr->for
1950: 6d 61 74 20 26 20 30 78 46 46 30 29 20 7b 0a 20 mat & 0xFF0) {.
1960: 20 20 20 63 61 73 65 20 54 59 50 45 5f 4d 44 3a case TYPE_MD:
1970: 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 45 . res = E
1980: 56 50 5f 44 69 67 65 73 74 55 70 64 61 74 65 28 VP_DigestUpdate(
1990: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 62 statePtr->ctx, b
19a0: 75 66 2c 20 28 73 69 7a 65 5f 74 29 20 72 65 61 uf, (size_t) rea
19b0: 64 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 d);..break;.
19c0: 63 61 73 65 20 54 59 50 45 5f 48 4d 41 43 3a 0a case TYPE_HMAC:.
19d0: 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 48 4d res = HM
19e0: 41 43 5f 55 70 64 61 74 65 28 73 74 61 74 65 50 AC_Update(stateP
19f0: 74 72 2d 3e 68 63 74 78 2c 20 28 63 6f 6e 73 74 tr->hctx, (const
1a00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
1a10: 29 20 62 75 66 2c 20 28 73 69 7a 65 5f 74 29 20 ) buf, (size_t)
1a20: 72 65 61 64 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 read);..break;.
1a30: 20 20 20 63 61 73 65 20 54 59 50 45 5f 43 4d 41 case TYPE_CMA
1a40: 43 3a 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d C:. res =
1a50: 20 43 4d 41 43 5f 55 70 64 61 74 65 28 73 74 61 CMAC_Update(sta
1a60: 74 65 50 74 72 2d 3e 63 63 74 78 2c 20 62 75 66 tePtr->cctx, buf
1a70: 2c 20 28 73 69 7a 65 5f 74 29 20 72 65 61 64 29 , (size_t) read)
1a80: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a ;..break;. }.
1a90: 0a 20 20 20 20 69 66 20 28 21 72 65 73 20 26 26 . if (!res &&
1aa0: 20 64 6f 5f 72 65 73 75 6c 74 29 20 7b 0a 09 54 do_result) {..T
1ab0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
1ac0: 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 statePtr->interp
1ad0: 2c 20 22 55 70 64 61 74 65 20 66 61 69 6c 65 64 , "Update failed
1ae0: 3a 20 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 41 : ", GET_ERR_REA
1af0: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
1b00: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
1b10: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
1b20: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
1b30: 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d K;.}../*. *-----
1b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
1b80: 2a 0a 20 2a 20 44 69 67 65 73 74 46 69 6e 61 6c *. * DigestFinal
1b90: 69 7a 65 20 2d 2d 0a 20 2a 0a 20 2a 09 46 69 6e ize --. *. *.Fin
1ba0: 61 6c 69 7a 65 20 61 20 68 61 73 68 20 66 75 6e alize a hash fun
1bb0: 63 74 69 6f 6e 20 61 6e 64 20 72 65 74 75 72 6e ction and return
1bc0: 20 74 68 65 20 6d 65 73 73 61 67 65 20 64 69 67 the message dig
1bd0: 65 73 74 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e est. *. * Return
1be0: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 s:. *.TCL_OK if
1bf0: 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 54 43 successful or TC
1c00: 4c 5f 45 52 52 4f 52 20 66 6f 72 20 66 61 69 6c L_ERROR for fail
1c10: 75 72 65 20 77 69 74 68 20 72 65 73 75 6c 74 20 ure with result
1c20: 73 65 74 0a 20 2a 09 74 6f 20 65 72 72 6f 72 20 set. *.to error
1c30: 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 20 53 message.. *. * S
1c40: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
1c50: 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 6d Sets result to m
1c60: 65 73 73 61 67 65 20 64 69 67 65 73 74 20 6f 72 essage digest or
1c70: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 an error messag
1c80: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
1c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
1cd0: 69 6e 74 20 44 69 67 65 73 74 46 69 6e 61 6c 69 int DigestFinali
1ce0: 7a 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 ze(Tcl_Interp *i
1cf0: 6e 74 65 72 70 2c 20 44 69 67 65 73 74 53 74 61 nterp, DigestSta
1d00: 74 65 20 2a 73 74 61 74 65 50 74 72 2c 20 54 63 te *statePtr, Tc
1d10: 6c 5f 4f 62 6a 20 2a 2a 72 65 73 75 6c 74 4f 62 l_Obj **resultOb
1d20: 6a 29 20 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 j) {. unsigne
1d30: 64 20 63 68 61 72 20 6d 64 5f 62 75 66 5b 45 56 d char md_buf[EV
1d40: 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 5d 3b 0a P_MAX_MD_SIZE];.
1d50: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 unsigned int
1d60: 20 75 6c 65 6e 3b 0a 20 20 20 20 69 6e 74 20 72 ulen;. int r
1d70: 65 73 20 3d 20 30 2c 20 6d 64 5f 6c 65 6e 20 3d es = 0, md_len =
1d80: 20 30 2c 20 74 79 70 65 20 3d 20 73 74 61 74 65 0, type = state
1d90: 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 30 78 Ptr->format & 0x
1da0: 46 46 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 FF0;.. dprint
1db0: 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 f("Called");..
1dc0: 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 68 61 /* Finalize ha
1dd0: 73 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 sh function and
1de0: 67 65 74 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 get result */.
1df0: 20 20 73 77 69 74 63 68 28 74 79 70 65 29 20 7b switch(type) {
1e00: 0a 20 20 20 20 63 61 73 65 20 54 59 50 45 5f 4d . case TYPE_M
1e10: 44 3a 0a 09 69 66 20 28 21 28 73 74 61 74 65 50 D:..if (!(stateP
1e20: 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 49 53 5f tr->format & IS_
1e30: 58 4f 46 29 20 7c 7c 20 73 74 61 74 65 50 74 72 XOF) || statePtr
1e40: 2d 3e 6c 65 6e 67 74 68 20 3d 3d 20 30 29 20 7b ->length == 0) {
1e50: 0a 09 20 20 20 20 2f 2a 20 4e 6f 6e 20 58 4f 46 .. /* Non XOF
1e60: 20 6f 72 20 58 4f 46 20 77 69 74 68 20 64 65 66 or XOF with def
1e70: 61 75 6c 74 20 6c 65 6e 67 74 68 20 2a 2f 0a 09 ault length */..
1e80: 20 20 20 20 72 65 73 20 3d 20 45 56 50 5f 44 69 res = EVP_Di
1e90: 67 65 73 74 46 69 6e 61 6c 5f 65 78 28 73 74 61 gestFinal_ex(sta
1ea0: 74 65 50 74 72 2d 3e 63 74 78 2c 20 6d 64 5f 62 tePtr->ctx, md_b
1eb0: 75 66 2c 20 26 75 6c 65 6e 29 3b 0a 09 20 20 20 uf, &ulen);..
1ec0: 20 6d 64 5f 6c 65 6e 20 3d 20 28 69 6e 74 29 20 md_len = (int)
1ed0: 75 6c 65 6e 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a ulen;..} else {.
1ee0: 09 20 20 20 20 2f 2a 20 58 4f 46 20 77 69 74 68 . /* XOF with
1ef0: 20 63 75 73 74 6f 6d 20 6c 65 6e 67 74 68 20 2a custom length *
1f00: 2f 0a 09 20 20 20 20 6d 64 5f 6c 65 6e 20 3d 20 /.. md_len =
1f10: 73 74 61 74 65 50 74 72 2d 3e 6c 65 6e 67 74 68 statePtr->length
1f20: 20 3c 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 < EVP_MAX_MD_SI
1f30: 5a 45 20 3f 20 73 74 61 74 65 50 74 72 2d 3e 6c ZE ? statePtr->l
1f40: 65 6e 67 74 68 20 3a 20 45 56 50 5f 4d 41 58 5f ength : EVP_MAX_
1f50: 4d 44 5f 53 49 5a 45 3b 0a 09 20 20 20 20 72 65 MD_SIZE;.. re
1f60: 73 20 3d 20 45 56 50 5f 44 69 67 65 73 74 46 69 s = EVP_DigestFi
1f70: 6e 61 6c 58 4f 46 28 73 74 61 74 65 50 74 72 2d nalXOF(statePtr-
1f80: 3e 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20 28 73 >ctx, md_buf, (s
1f90: 69 7a 65 5f 74 29 20 6d 64 5f 6c 65 6e 29 3b 0a ize_t) md_len);.
1fa0: 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 .}..break;. c
1fb0: 61 73 65 20 54 59 50 45 5f 48 4d 41 43 3a 0a 09 ase TYPE_HMAC:..
1fc0: 72 65 73 20 3d 20 48 4d 41 43 5f 46 69 6e 61 6c res = HMAC_Final
1fd0: 28 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 2c (statePtr->hctx,
1fe0: 20 6d 64 5f 62 75 66 2c 20 26 75 6c 65 6e 29 3b md_buf, &ulen);
1ff0: 0a 09 6d 64 5f 6c 65 6e 20 3d 20 28 69 6e 74 29 ..md_len = (int)
2000: 20 75 6c 65 6e 3b 0a 09 62 72 65 61 6b 3b 0a 20 ulen;..break;.
2010: 20 20 20 63 61 73 65 20 54 59 50 45 5f 43 4d 41 case TYPE_CMA
2020: 43 3a 0a 09 7b 0a 09 20 20 20 20 73 69 7a 65 5f C:..{.. size_
2030: 74 20 6c 65 6e 67 74 68 3b 0a 09 20 20 20 20 72 t length;.. r
2040: 65 73 20 3d 20 43 4d 41 43 5f 46 69 6e 61 6c 28 es = CMAC_Final(
2050: 73 74 61 74 65 50 74 72 2d 3e 63 63 74 78 2c 20 statePtr->cctx,
2060: 6d 64 5f 62 75 66 2c 20 26 6c 65 6e 67 74 68 29 md_buf, &length)
2070: 3b 0a 09 20 20 20 20 6d 64 5f 6c 65 6e 20 3d 20 ;.. md_len =
2080: 28 69 6e 74 29 20 6c 65 6e 67 74 68 3b 0a 09 20 (int) length;..
2090: 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 break;..}.
20a0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 21 72 65 73 }.. if (!res
20b0: 29 20 7b 0a 09 69 66 20 28 72 65 73 75 6c 74 4f ) {..if (resultO
20c0: 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 bj == NULL) {..
20d0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 Tcl_AppendRes
20e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 46 69 6e ult(interp, "Fin
20f0: 61 6c 69 7a 65 20 66 61 69 6c 65 64 3a 20 22 2c alize failed: ",
2100: 20 47 45 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 GET_ERR_REASON(
2110: 29 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ), (char *) NULL
2120: 29 3b 0a 09 7d 0a 09 72 65 74 75 72 6e 20 54 43 );..}..return TC
2130: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
2140: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 6d 65 /* Return me
2150: 73 73 61 67 65 20 64 69 67 65 73 74 20 61 73 20 ssage digest as
2160: 65 69 74 68 65 72 20 61 20 62 69 6e 61 72 79 20 either a binary
2170: 6f 72 20 68 65 78 20 73 74 72 69 6e 67 20 2a 2f or hex string */
2180: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
2190: 72 2d 3e 66 6f 72 6d 61 74 20 26 20 42 49 4e 5f r->format & BIN_
21a0: 46 4f 52 4d 41 54 29 20 7b 0a 09 69 66 20 28 72 FORMAT) {..if (r
21b0: 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c esultObj == NULL
21c0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 ) {.. Tcl_Set
21d0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
21e0: 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 , Tcl_NewByteArr
21f0: 61 79 4f 62 6a 28 6d 64 5f 62 75 66 2c 20 28 54 ayObj(md_buf, (T
2200: 63 6c 5f 53 69 7a 65 29 20 6d 64 5f 6c 65 6e 29 cl_Size) md_len)
2210: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 );..} else {..
2220: 20 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 *resultObj = T
2230: 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f cl_NewByteArrayO
2240: 62 6a 28 6d 64 5f 62 75 66 2c 20 28 54 63 6c 5f bj(md_buf, (Tcl_
2250: 53 69 7a 65 29 20 6d 64 5f 6c 65 6e 29 3b 0a 09 Size) md_len);..
2260: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
2270: 6f 75 6e 74 28 2a 72 65 73 75 6c 74 4f 62 6a 29 ount(*resultObj)
2280: 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 65 6c 73 65 ;..}.. } else
2290: 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6e 65 77 {..Tcl_Obj *new
22a0: 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a Obj = Tcl_NewObj
22b0: 28 29 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 ();..unsigned ch
22c0: 61 72 20 2a 70 74 72 20 3d 20 54 63 6c 5f 53 65 ar *ptr = Tcl_Se
22d0: 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68 tByteArrayLength
22e0: 28 6e 65 77 4f 62 6a 2c 20 28 54 63 6c 5f 53 69 (newObj, (Tcl_Si
22f0: 7a 65 29 20 6d 64 5f 6c 65 6e 2a 32 29 3b 0a 0a ze) md_len*2);..
2300: 09 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b .for (int i = 0;
2310: 20 69 20 3c 20 6d 64 5f 6c 65 6e 3b 20 69 2b 2b i < md_len; i++
2320: 29 20 7b 0a 09 20 20 20 20 2a 70 74 72 2b 2b 20 ) {.. *ptr++
2330: 3d 20 68 65 78 5b 28 6d 64 5f 62 75 66 5b 69 5d = hex[(md_buf[i]
2340: 20 3e 3e 20 34 29 20 26 20 30 78 30 46 5d 3b 0a >> 4) & 0x0F];.
2350: 09 20 20 20 20 2a 70 74 72 2b 2b 20 3d 20 68 65 . *ptr++ = he
2360: 78 5b 6d 64 5f 62 75 66 5b 69 5d 20 26 20 30 78 x[md_buf[i] & 0x
2370: 30 46 5d 3b 0a 09 7d 0a 0a 09 69 66 20 28 72 65 0F];..}...if (re
2380: 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 sultObj == NULL)
2390: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4f {.. Tcl_SetO
23a0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
23b0: 20 6e 65 77 4f 62 6a 29 3b 0a 09 7d 20 65 6c 73 newObj);..} els
23c0: 65 20 7b 0a 09 20 20 20 20 2a 72 65 73 75 6c 74 e {.. *result
23d0: 4f 62 6a 20 3d 20 6e 65 77 4f 62 6a 3b 0a 09 20 Obj = newObj;..
23e0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
23f0: 75 6e 74 28 2a 72 65 73 75 6c 74 4f 62 6a 29 3b unt(*resultObj);
2400: 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 ..}. }. re
2410: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a turn TCL_OK;.}..
2420: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /***************
2430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2450: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2460: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d ****/../*. *----
2470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
24b0: 20 2a 0a 20 2a 20 44 69 67 65 73 74 42 6c 6f 63 *. * DigestBloc
24c0: 6b 4d 6f 64 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a kModeProc --. *.
24d0: 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e *.This function
24e0: 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 74 is invoked by t
24f0: 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c 65 he generic IO le
2500: 76 65 6c 0a 20 2a 09 74 6f 20 73 65 74 20 62 6c vel. *.to set bl
2510: 6f 63 6b 69 6e 67 20 61 6e 64 20 6e 6f 6e 62 6c ocking and nonbl
2520: 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 2e 0a 20 2a ocking modes.. *
2530: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 . * Returns:. *.
2540: 30 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 0 if successful
2550: 6f 72 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63 or POSIX error c
2560: 6f 64 65 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 ode if failed..
2570: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
2580: 73 3a 0a 20 2a 09 53 65 74 73 20 74 68 65 20 64 s:. *.Sets the d
2590: 65 76 69 63 65 20 69 6e 74 6f 20 62 6c 6f 63 6b evice into block
25a0: 69 6e 67 20 6f 72 20 6e 6f 6e 62 6c 6f 63 6b 69 ing or nonblocki
25b0: 6e 67 20 6d 6f 64 65 2e 0a 20 2a 09 43 61 6e 20 ng mode.. *.Can
25c0: 63 61 6c 6c 20 54 63 6c 5f 53 65 74 43 68 61 6e call Tcl_SetChan
25d0: 6e 65 6c 45 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d nelError.. *. *-
25e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
25f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2620: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
2630: 74 20 44 69 67 65 73 74 42 6c 6f 63 6b 4d 6f 64 t DigestBlockMod
2640: 65 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 eProc(ClientData
2650: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 clientData, int
2660: 20 6d 6f 64 65 29 20 7b 0a 20 20 20 20 44 69 67 mode) {. Dig
2670: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 estState *stateP
2680: 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 tr = (DigestStat
2690: 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b e *) clientData;
26a0: 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 3d .. if (mode =
26b0: 3d 20 54 43 4c 5f 4d 4f 44 45 5f 4e 4f 4e 42 4c = TCL_MODE_NONBL
26c0: 4f 43 4b 49 4e 47 29 20 7b 0a 09 73 74 61 74 65 OCKING) {..state
26d0: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c Ptr->flags |= TL
26e0: 53 5f 54 43 4c 5f 41 53 59 4e 43 3b 0a 20 20 20 S_TCL_ASYNC;.
26f0: 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 } else {..state
2700: 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 Ptr->flags &= ~(
2710: 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 3b 0a TLS_TCL_ASYNC);.
2720: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
2730: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 0;.}../*. *----
2740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
2780: 20 2a 0a 20 2a 20 44 69 67 65 73 74 43 6c 6f 73 *. * DigestClos
2790: 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 eProc --. *. *.T
27a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 his function is
27b0: 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67 invoked by the g
27c0: 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 20 eneric IO level
27d0: 74 6f 20 70 65 72 66 6f 72 6d 0a 20 2a 09 63 68 to perform. *.ch
27e0: 61 6e 6e 65 6c 2d 74 79 70 65 20 73 70 65 63 69 annel-type speci
27f0: 66 69 63 20 63 6c 65 61 6e 75 70 20 77 68 65 6e fic cleanup when
2800: 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 69 73 20 the channel is
2810: 63 6c 6f 73 65 64 2e 20 41 6c 6c 0a 20 2a 09 71 closed. All. *.q
2820: 75 65 75 65 64 20 6f 75 74 70 75 74 20 69 73 20 ueued output is
2830: 66 6c 75 73 68 65 64 20 70 72 69 6f 72 20 74 6f flushed prior to
2840: 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 calling this fu
2850: 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 nction.. *. * Re
2860: 74 75 72 6e 73 3a 0a 20 2a 09 30 20 69 66 20 73 turns:. *.0 if s
2870: 75 63 63 65 73 73 66 75 6c 20 6f 72 20 50 4f 53 uccessful or POS
2880: 49 58 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 IX error code if
2890: 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 failed.. *. * S
28a0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
28b0: 44 65 6c 65 74 65 73 20 73 74 6f 72 65 64 20 73 Deletes stored s
28c0: 74 61 74 65 20 64 61 74 61 2e 0a 20 2a 0a 20 2a tate data.. *. *
28d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2910: 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 ---. */.int Dige
2920: 73 74 43 6c 6f 73 65 50 72 6f 63 28 43 6c 69 65 stCloseProc(Clie
2930: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
2940: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
2950: 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 44 69 67 nterp) {. Dig
2960: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 estState *stateP
2970: 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 tr = (DigestStat
2980: 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b e *) clientData;
2990: 0a 0a 20 20 20 20 2f 2a 20 43 61 6e 63 65 6c 20 .. /* Cancel
29a0: 61 63 74 69 76 65 20 74 69 6d 65 72 2c 20 69 66 active timer, if
29b0: 20 61 6e 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 any */. if (
29c0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 statePtr->timer
29d0: 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b != (Tcl_TimerTok
29e0: 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c en) NULL) {..Tcl
29f0: 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 _DeleteTimerHand
2a00: 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 ler(statePtr->ti
2a10: 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d mer);..statePtr-
2a20: 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 >timer = (Tcl_Ti
2a30: 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a merToken) NULL;.
2a40: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 75 }.. /* Ou
2a50: 74 70 75 74 20 6d 65 73 73 61 67 65 20 64 69 67 tput message dig
2a60: 65 73 74 20 69 66 20 6e 6f 74 20 61 6c 72 65 61 est if not alrea
2a70: 64 79 20 64 6f 6e 65 20 2a 2f 0a 20 20 20 20 69 dy done */. i
2a80: 66 20 28 21 28 73 74 61 74 65 50 74 72 2d 3e 66 f (!(statePtr->f
2a90: 6c 61 67 73 20 26 20 43 48 41 4e 5f 45 4f 46 29 lags & CHAN_EOF)
2aa0: 29 20 7b 0a 09 54 63 6c 5f 43 68 61 6e 6e 65 6c ) {..Tcl_Channel
2ab0: 20 70 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 parent = Tcl_Ge
2ac0: 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 tStackedChannel(
2ad0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b statePtr->self);
2ae0: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c ..Tcl_Obj *resul
2af0: 74 4f 62 6a 3b 0a 09 54 63 6c 5f 53 69 7a 65 20 tObj;..Tcl_Size
2b00: 77 72 69 74 74 65 6e 2c 20 74 6f 57 72 69 74 65 written, toWrite
2b10: 3b 0a 0a 09 69 66 20 28 44 69 67 65 73 74 46 69 ;...if (DigestFi
2b20: 6e 61 6c 69 7a 65 28 73 74 61 74 65 50 74 72 2d nalize(statePtr-
2b30: 3e 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 >interp, statePt
2b40: 72 2c 20 26 72 65 73 75 6c 74 4f 62 6a 29 20 3d r, &resultObj) =
2b50: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 = TCL_OK) {..
2b60: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
2b70: 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 data = Tcl_GetBy
2b80: 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 72 teArrayFromObj(r
2b90: 65 73 75 6c 74 4f 62 6a 2c 20 26 74 6f 57 72 69 esultObj, &toWri
2ba0: 74 65 29 3b 0a 09 20 20 20 20 77 72 69 74 74 65 te);.. writte
2bb0: 6e 20 3d 20 54 63 6c 5f 57 72 69 74 65 52 61 77 n = Tcl_WriteRaw
2bc0: 28 70 61 72 65 6e 74 2c 20 28 63 6f 6e 73 74 20 (parent, (const
2bd0: 63 68 61 72 20 2a 29 20 64 61 74 61 2c 20 74 6f char *) data, to
2be0: 57 72 69 74 65 29 3b 0a 20 20 20 20 20 20 20 20 Write);.
2bf0: 20 20 20 20 69 66 20 28 77 72 69 74 74 65 6e 20 if (written
2c00: 21 3d 20 74 6f 57 72 69 74 65 29 20 7b 0a 20 20 != toWrite) {.
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
2c20: 20 45 72 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 Error */.
2c30: 20 20 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c }.. Tcl
2c40: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65 _DecrRefCount(re
2c50: 73 75 6c 74 4f 62 6a 29 3b 0a 09 7d 0a 09 73 74 sultObj);..}..st
2c60: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d atePtr->flags |=
2c70: 20 43 48 41 4e 5f 45 4f 46 3b 0a 20 20 20 20 7d CHAN_EOF;. }
2c80: 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 .. /* Clean-u
2c90: 70 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 53 p */. DigestS
2ca0: 74 61 74 65 46 72 65 65 28 73 74 61 74 65 50 74 tateFree(statePt
2cb0: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 r);. return 0
2cc0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 61 6d 65 20 ;.}../*. * Same
2cd0: 61 73 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 as DigestClosePr
2ce0: 6f 63 20 62 75 74 20 77 69 74 68 20 69 6e 64 69 oc but with indi
2cf0: 76 69 64 75 61 6c 20 72 65 61 64 20 61 6e 64 20 vidual read and
2d00: 77 72 69 74 65 20 63 6c 6f 73 65 20 63 6f 6e 74 write close cont
2d10: 72 6f 6c 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 rol. */.static i
2d20: 6e 74 20 44 69 67 65 73 74 43 6c 6f 73 65 32 50 nt DigestClose2P
2d30: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 roc(ClientData i
2d40: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 54 63 6c nstanceData, Tcl
2d50: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
2d60: 20 69 6e 74 20 66 6c 61 67 73 29 20 7b 0a 0a 20 int flags) {..
2d70: 20 20 20 69 66 20 28 28 66 6c 61 67 73 20 26 20 if ((flags &
2d80: 28 54 43 4c 5f 43 4c 4f 53 45 5f 52 45 41 44 20 (TCL_CLOSE_READ
2d90: 7c 20 54 43 4c 5f 43 4c 4f 53 45 5f 57 52 49 54 | TCL_CLOSE_WRIT
2da0: 45 29 29 20 3d 3d 20 30 29 20 7b 0a 09 72 65 74 E)) == 0) {..ret
2db0: 75 72 6e 20 44 69 67 65 73 74 43 6c 6f 73 65 50 urn DigestCloseP
2dc0: 72 6f 63 28 69 6e 73 74 61 6e 63 65 44 61 74 61 roc(instanceData
2dd0: 2c 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d , interp);. }
2de0: 0a 20 20 20 20 72 65 74 75 72 6e 20 45 49 4e 56 . return EINV
2df0: 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d AL;.}../*. *----
2e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e40: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 49 --. *. * DigestI
2e50: 6e 70 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 nputProc --. *.
2e60: 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20 *.Called by the
2e70: 67 65 6e 65 72 69 63 20 49 4f 20 73 79 73 74 65 generic IO syste
2e80: 6d 20 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 m to read data f
2e90: 72 6f 6d 20 74 72 61 6e 73 66 6f 72 6d 20 61 6e rom transform an
2ea0: 64 0a 20 2a 09 70 6c 61 63 65 20 69 6e 20 62 75 d. *.place in bu
2eb0: 66 2e 20 54 72 61 6e 73 66 6f 72 6d 20 67 65 74 f. Transform get
2ec0: 73 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 s data from the
2ed0: 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e underlying chann
2ee0: 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e el.. *. * Return
2ef0: 73 3a 0a 20 2a 09 54 6f 74 61 6c 20 62 79 74 65 s:. *.Total byte
2f00: 73 20 72 65 61 64 20 6f 72 20 2d 31 20 66 6f 72 s read or -1 for
2f10: 20 61 6e 20 65 72 72 6f 72 20 61 6c 6f 6e 67 20 an error along
2f20: 77 69 74 68 20 61 20 50 4f 53 49 58 20 65 72 72 with a POSIX err
2f30: 6f 72 0a 20 2a 09 63 6f 64 65 20 69 6e 20 65 72 or. *.code in er
2f40: 72 6f 72 43 6f 64 65 50 74 72 2e 20 55 73 65 20 rorCodePtr. Use
2f50: 45 41 47 41 49 4e 20 66 6f 72 20 6e 6f 6e 62 6c EAGAIN for nonbl
2f60: 6f 63 6b 69 6e 67 20 61 6e 64 20 6e 6f 20 64 61 ocking and no da
2f70: 74 61 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ta.. *. * Side e
2f80: 66 66 65 63 74 73 3a 0a 20 2a 09 52 65 61 64 20 ffects:. *.Read
2f90: 64 61 74 61 20 66 72 6f 6d 20 74 72 61 6e 73 66 data from transf
2fa0: 6f 72 6d 20 61 6e 64 20 77 72 69 74 65 20 74 6f orm and write to
2fb0: 20 62 75 66 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d buf. *. *------
2fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3000: 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 49 . */.int DigestI
3010: 6e 70 75 74 50 72 6f 63 28 43 6c 69 65 6e 74 44 nputProc(ClientD
3020: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
3030: 63 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 74 char *buf, int t
3040: 6f 52 65 61 64 2c 20 69 6e 74 20 2a 65 72 72 6f oRead, int *erro
3050: 72 43 6f 64 65 50 74 72 29 20 7b 0a 20 20 20 20 rCodePtr) {.
3060: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 DigestState *sta
3070: 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 tePtr = (DigestS
3080: 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 tate *) clientDa
3090: 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e ta;. Tcl_Chan
30a0: 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 nel parent;.
30b0: 54 63 6c 5f 53 69 7a 65 20 72 65 61 64 3b 0a 20 Tcl_Size read;.
30c0: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 *errorCodePtr
30d0: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 = 0;.. /* Ab
30e0: 6f 72 74 20 69 66 20 6e 6f 74 68 69 6e 67 20 74 ort if nothing t
30f0: 6f 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 20 o process */.
3100: 20 69 66 20 28 74 6f 52 65 61 64 20 3c 3d 20 30 if (toRead <= 0
3110: 20 7c 7c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 || statePtr->se
3120: 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e lf == (Tcl_Chann
3130: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 el) NULL) {..ret
3140: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 urn 0;. }..
3150: 20 20 2f 2a 20 47 65 74 20 62 79 74 65 73 20 66 /* Get bytes f
3160: 72 6f 6d 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 rom underlying c
3170: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 70 61 hannel */. pa
3180: 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 rent = Tcl_GetSt
3190: 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 ackedChannel(sta
31a0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 tePtr->self);.
31b0: 20 20 72 65 61 64 20 3d 20 54 63 6c 5f 52 65 61 read = Tcl_Rea
31c0: 64 52 61 77 28 70 61 72 65 6e 74 2c 20 62 75 66 dRaw(parent, buf
31d0: 2c 20 28 54 63 6c 5f 53 69 7a 65 29 20 74 6f 52 , (Tcl_Size) toR
31e0: 65 61 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 ead);.. /* Up
31f0: 64 61 74 65 20 68 61 73 68 20 66 75 6e 63 74 69 date hash functi
3200: 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 on */. if (re
3210: 61 64 20 3e 20 30 29 20 7b 0a 09 2f 2a 20 48 61 ad > 0) {../* Ha
3220: 76 65 20 64 61 74 61 20 2a 2f 0a 09 69 66 20 28 ve data */..if (
3230: 44 69 67 65 73 74 55 70 64 61 74 65 28 73 74 61 DigestUpdate(sta
3240: 74 65 50 74 72 2c 20 62 75 66 2c 20 72 65 61 64 tePtr, buf, read
3250: 2c 20 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 , 0) != TCL_OK)
3260: 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 43 68 {.. Tcl_SetCh
3270: 61 6e 6e 65 6c 45 72 72 6f 72 28 73 74 61 74 65 annelError(state
3280: 50 74 72 2d 3e 73 65 6c 66 2c 20 54 63 6c 5f 4f Ptr->self, Tcl_O
3290: 62 6a 50 72 69 6e 74 66 28 22 55 70 64 61 74 65 bjPrintf("Update
32a0: 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 47 45 failed: %s", GE
32b0: 54 5f 45 52 52 5f 52 45 41 53 4f 4e 28 29 29 29 T_ERR_REASON()))
32c0: 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 ;.. *errorCod
32d0: 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 ePtr = EINVAL;..
32e0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 7d return 0;..}
32f0: 0a 09 2f 2a 20 54 68 69 73 20 69 73 20 63 6f 72 ../* This is cor
3300: 72 65 63 74 20 2a 2f 0a 09 72 65 61 64 20 3d 20 rect */..read =
3310: 2d 31 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 -1;..*errorCodeP
3320: 74 72 20 3d 20 45 41 47 41 49 4e 3b 0a 0a 20 20 tr = EAGAIN;..
3330: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 61 } else if (rea
3340: 64 20 3c 20 30 29 20 7b 0a 09 2f 2a 20 45 72 72 d < 0) {../* Err
3350: 6f 72 20 2a 2f 0a 09 2a 65 72 72 6f 72 43 6f 64 or */..*errorCod
3360: 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 ePtr = Tcl_GetEr
3370: 72 6e 6f 28 29 3b 0a 0a 20 20 20 20 7d 20 65 6c rno();.. } el
3380: 73 65 20 69 66 20 28 21 28 73 74 61 74 65 50 74 se if (!(statePt
3390: 72 2d 3e 66 6c 61 67 73 20 26 20 43 48 41 4e 5f r->flags & CHAN_
33a0: 45 4f 46 29 29 20 7b 0a 09 2f 2a 20 45 4f 46 20 EOF)) {../* EOF
33b0: 2a 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 */..Tcl_Obj *res
33c0: 75 6c 74 4f 62 6a 3b 0a 09 69 66 20 28 44 69 67 ultObj;..if (Dig
33d0: 65 73 74 46 69 6e 61 6c 69 7a 65 28 73 74 61 74 estFinalize(stat
33e0: 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 73 74 ePtr->interp, st
33f0: 61 74 65 50 74 72 2c 20 26 72 65 73 75 6c 74 4f atePtr, &resultO
3400: 62 6a 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b bj) == TCL_OK) {
3410: 0a 09 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 .. unsigned c
3420: 68 61 72 20 2a 64 61 74 61 20 3d 20 54 63 6c 5f har *data = Tcl_
3430: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d GetByteArrayFrom
3440: 4f 62 6a 28 72 65 73 75 6c 74 4f 62 6a 2c 20 26 Obj(resultObj, &
3450: 72 65 61 64 29 3b 0a 09 20 20 20 20 6d 65 6d 63 read);.. memc
3460: 70 79 28 62 75 66 2c 20 64 61 74 61 2c 20 28 69 py(buf, data, (i
3470: 6e 74 29 20 72 65 61 64 29 3b 0a 09 20 20 20 20 nt) read);..
3480: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
3490: 28 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 0a 09 7d (resultObj);...}
34a0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c else {.. Tcl
34b0: 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72 _SetChannelError
34c0: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c (statePtr->self,
34d0: 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 22 Tcl_ObjPrintf("
34e0: 46 69 6e 61 6c 69 7a 65 20 66 61 69 6c 65 64 3a Finalize failed:
34f0: 20 25 73 22 2c 20 47 45 54 5f 45 52 52 5f 52 45 %s", GET_ERR_RE
3500: 41 53 4f 4e 28 29 29 29 3b 0a 09 20 20 20 20 2a ASON()));.. *
3510: 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 errorCodePtr = E
3520: 49 4e 56 41 4c 3b 0a 09 20 20 20 20 72 65 61 64 INVAL;.. read
3530: 20 3d 20 30 3b 0a 09 7d 0a 09 73 74 61 74 65 50 = 0;..}..stateP
3540: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 48 41 tr->flags |= CHA
3550: 4e 5f 45 4f 46 3b 0a 20 20 20 20 7d 0a 20 20 20 N_EOF;. }.
3560: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 20 72 65 return (int) re
3570: 61 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d ad;.}../*. *----
3580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35c0: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 4f --. *. * DigestO
35d0: 75 74 70 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a utputProc --. *.
35e0: 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65 *.Called by the
35f0: 20 67 65 6e 65 72 69 63 20 49 4f 20 73 79 73 74 generic IO syst
3600: 65 6d 20 74 6f 20 77 72 69 74 65 20 64 61 74 61 em to write data
3610: 20 69 6e 20 62 75 66 20 74 6f 20 74 72 61 6e 73 in buf to trans
3620: 66 6f 72 6d 2e 0a 20 2a 09 54 68 65 20 74 72 61 form.. *.The tra
3630: 6e 73 66 6f 72 6d 20 77 72 69 74 65 73 20 74 68 nsform writes th
3640: 65 20 72 65 73 75 6c 74 20 74 6f 20 74 68 65 20 e result to the
3650: 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e underlying chann
3660: 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e el.. *. * Return
3670: 73 3a 0a 20 2a 09 54 6f 74 61 6c 20 62 79 74 65 s:. *.Total byte
3680: 73 20 77 72 69 74 74 65 6e 20 6f 72 20 2d 31 20 s written or -1
3690: 66 6f 72 20 61 6e 20 65 72 72 6f 72 20 61 6c 6f for an error alo
36a0: 6e 67 20 77 69 74 68 20 61 20 50 4f 53 49 58 20 ng with a POSIX
36b0: 65 72 72 6f 72 0a 20 2a 09 63 6f 64 65 20 69 6e error. *.code in
36c0: 20 65 72 72 6f 72 43 6f 64 65 50 74 72 2e 20 55 errorCodePtr. U
36d0: 73 65 20 45 41 47 41 49 4e 20 66 6f 72 20 6e 6f se EAGAIN for no
36e0: 6e 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 20 63 61 nblocking and ca
36f0: 6e 27 74 20 77 72 69 74 65 20 64 61 74 61 2e 0a n't write data..
3700: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
3710: 74 73 3a 0a 20 2a 09 47 65 74 20 64 61 74 61 20 ts:. *.Get data
3720: 66 72 6f 6d 20 62 75 66 20 61 6e 64 20 75 70 64 from buf and upd
3730: 61 74 65 20 64 69 67 65 73 74 0a 20 2a 0a 20 2a ate digest. *. *
3740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3780: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 20 69 6e 74 20 ------. */. int
3790: 44 69 67 65 73 74 4f 75 74 70 75 74 50 72 6f 63 DigestOutputProc
37a0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
37b0: 6e 74 44 61 74 61 2c 20 63 6f 6e 73 74 20 63 68 ntData, const ch
37c0: 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 74 6f 57 ar *buf, int toW
37d0: 72 69 74 65 2c 20 69 6e 74 20 2a 65 72 72 6f 72 rite, int *error
37e0: 43 6f 64 65 50 74 72 29 20 7b 0a 20 20 20 20 44 CodePtr) {. D
37f0: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 igestState *stat
3800: 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 ePtr = (DigestSt
3810: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 ate *) clientDat
3820: 61 3b 0a 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 a;. *errorCod
3830: 65 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f ePtr = 0;.. /
3840: 2a 20 41 62 6f 72 74 20 69 66 20 6e 6f 74 68 69 * Abort if nothi
3850: 6e 67 20 74 6f 20 70 72 6f 63 65 73 73 20 2a 2f ng to process */
3860: 0a 20 20 20 20 69 66 20 28 74 6f 57 72 69 74 65 . if (toWrite
3870: 20 3c 3d 20 30 20 7c 7c 20 73 74 61 74 65 50 74 <= 0 || statePt
3880: 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f r->self == (Tcl_
3890: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
38a0: 0a 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 ..return 0;.
38b0: 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65 }.. /* Update
38c0: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a hash function *
38d0: 2f 0a 20 20 20 20 69 66 20 28 44 69 67 65 73 74 /. if (Digest
38e0: 55 70 64 61 74 65 28 73 74 61 74 65 50 74 72 2c Update(statePtr,
38f0: 20 28 63 68 61 72 20 2a 29 20 62 75 66 2c 20 28 (char *) buf, (
3900: 54 63 6c 5f 53 69 7a 65 29 20 74 6f 57 72 69 74 Tcl_Size) toWrit
3910: 65 2c 20 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 e, 0) != TCL_OK)
3920: 20 7b 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e {..Tcl_SetChann
3930: 65 6c 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 elError(statePtr
3940: 2d 3e 73 65 6c 66 2c 20 54 63 6c 5f 4f 62 6a 50 ->self, Tcl_ObjP
3950: 72 69 6e 74 66 28 22 55 70 64 61 74 65 20 66 61 rintf("Update fa
3960: 69 6c 65 64 3a 20 25 73 22 2c 20 47 45 54 5f 45 iled: %s", GET_E
3970: 52 52 5f 52 45 41 53 4f 4e 28 29 29 29 3b 0a 09 RR_REASON()));..
3980: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
3990: 45 49 4e 56 41 4c 3b 0a 09 72 65 74 75 72 6e 20 EINVAL;..return
39a0: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 0;. }. ret
39b0: 75 72 6e 20 74 6f 57 72 69 74 65 3b 0a 7d 0a 0a urn toWrite;.}..
39c0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
39d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
39e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
39f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
3a10: 2a 20 44 69 67 65 73 74 53 65 74 4f 70 74 69 6f * DigestSetOptio
3a20: 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 nProc --. *. *.C
3a30: 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e alled by the gen
3a40: 65 72 69 63 20 49 4f 20 73 79 73 74 65 6d 20 74 eric IO system t
3a50: 6f 20 73 65 74 20 63 68 61 6e 6e 65 6c 20 6f 70 o set channel op
3a60: 74 69 6f 6e 20 6e 61 6d 65 20 74 6f 20 76 61 6c tion name to val
3a70: 75 65 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e ue.. *. * Return
3a80: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 s:. *.TCL_OK if
3a90: 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 54 43 successful or TC
3aa0: 4c 5f 45 52 52 4f 52 20 69 66 20 66 61 69 6c 65 L_ERROR if faile
3ab0: 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 61 6e 20 d along with an
3ac0: 65 72 72 6f 72 0a 20 2a 09 6d 65 73 73 61 67 65 error. *.message
3ad0: 20 69 6e 20 69 6e 74 65 72 70 20 61 6e 64 20 54 in interp and T
3ae0: 63 6c 5f 53 65 74 45 72 72 6e 6f 2e 0a 20 2a 0a cl_SetErrno.. *.
3af0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
3b00: 0a 20 2a 09 55 70 64 61 74 65 73 20 63 68 61 6e . *.Updates chan
3b10: 6e 65 6c 20 6f 70 74 69 6f 6e 20 74 6f 20 6e 65 nel option to ne
3b20: 77 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a 2d 2d w value.. *. *--
3b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b70: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
3b80: 69 6e 74 20 44 69 67 65 73 74 53 65 74 4f 70 74 int DigestSetOpt
3b90: 69 6f 6e 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 ionProc(ClientDa
3ba0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
3bb0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
3bc0: 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f p, const char *o
3bd0: 70 74 69 6f 6e 4e 61 6d 65 2c 0a 09 63 6f 6e 73 ptionName,..cons
3be0: 74 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 56 61 t char *optionVa
3bf0: 6c 75 65 29 20 7b 0a 20 20 20 20 44 69 67 65 73 lue) {. Diges
3c00: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 tState *statePtr
3c10: 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 = (DigestState
3c20: 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 *) clientData;.
3c30: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 Tcl_Channel p
3c40: 61 72 65 6e 74 3b 0a 20 20 20 20 54 63 6c 5f 44 arent;. Tcl_D
3c50: 72 69 76 65 72 53 65 74 4f 70 74 69 6f 6e 50 72 riverSetOptionPr
3c60: 6f 63 20 2a 73 65 74 4f 70 74 69 6f 6e 50 72 6f oc *setOptionPro
3c70: 63 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 c;.. /* Abort
3c80: 20 69 66 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a if no channel *
3c90: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 /. if (stateP
3ca0: 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c tr->self == (Tcl
3cb0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
3cc0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
3cd0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
3ce0: 2f 2a 20 44 65 6c 65 67 61 74 65 20 6f 70 74 69 /* Delegate opti
3cf0: 6f 6e 73 20 64 6f 77 6e 73 74 72 65 61 6d 20 2a ons downstream *
3d00: 2f 0a 20 20 20 20 70 61 72 65 6e 74 20 3d 20 54 /. parent = T
3d10: 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 cl_GetStackedCha
3d20: 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 nnel(statePtr->s
3d30: 65 6c 66 29 3b 0a 20 20 20 20 73 65 74 4f 70 74 elf);. setOpt
3d40: 69 6f 6e 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 ionProc = Tcl_Ch
3d50: 61 6e 6e 65 6c 53 65 74 4f 70 74 69 6f 6e 50 72 annelSetOptionPr
3d60: 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 oc(Tcl_GetChanne
3d70: 6c 54 79 70 65 28 70 61 72 65 6e 74 29 29 3b 0a lType(parent));.
3d80: 20 20 20 20 69 66 20 28 73 65 74 4f 70 74 69 6f if (setOptio
3d90: 6e 50 72 6f 63 20 21 3d 20 4e 55 4c 4c 29 20 7b nProc != NULL) {
3da0: 0a 09 72 65 74 75 72 6e 20 28 2a 73 65 74 4f 70 ..return (*setOp
3db0: 74 69 6f 6e 50 72 6f 63 29 28 54 63 6c 5f 47 65 tionProc)(Tcl_Ge
3dc0: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 tChannelInstance
3dd0: 44 61 74 61 28 70 61 72 65 6e 74 29 2c 20 69 6e Data(parent), in
3de0: 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 terp, optionName
3df0: 2c 20 6f 70 74 69 6f 6e 56 61 6c 75 65 29 3b 0a , optionValue);.
3e00: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 } else {..Tc
3e10: 6c 5f 53 65 74 45 72 72 6e 6f 28 45 49 4e 56 41 l_SetErrno(EINVA
3e20: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 63 6c 5f L);..return Tcl_
3e30: 42 61 64 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e BadChannelOption
3e40: 28 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e (interp, optionN
3e50: 61 6d 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 ame, NULL);.
3e60: 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d }.}../*. *------
3e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3eb0: 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 47 65 74 . *. * DigestGet
3ec0: 4f 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a OptionProc --. *
3ed0: 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 68 . *.Called by th
3ee0: 65 20 67 65 6e 65 72 69 63 20 49 4f 20 73 79 73 e generic IO sys
3ef0: 74 65 6d 20 74 6f 20 67 65 74 20 63 68 61 6e 6e tem to get chann
3f00: 65 6c 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 27 73 el option name's
3f10: 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a 20 52 65 value.. *. * Re
3f20: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b turns:. *.TCL_OK
3f30: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f if successful o
3f40: 72 20 54 43 4c 5f 45 52 52 4f 52 20 69 66 20 66 r TCL_ERROR if f
3f50: 61 69 6c 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 ailed along with
3f60: 20 61 6e 20 65 72 72 6f 72 0a 20 2a 09 6d 65 73 an error. *.mes
3f70: 73 61 67 65 20 69 6e 20 69 6e 74 65 72 70 20 61 sage in interp a
3f80: 6e 64 20 54 63 6c 5f 53 65 74 45 72 72 6e 6f 2e nd Tcl_SetErrno.
3f90: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
3fa0: 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 cts:. *.Sets res
3fb0: 75 6c 74 20 74 6f 20 6f 70 74 69 6f 6e 27 73 20 ult to option's
3fc0: 76 61 6c 75 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d value. *. *-----
3fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4010: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
4020: 20 44 69 67 65 73 74 47 65 74 4f 70 74 69 6f 6e DigestGetOption
4030: 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 Proc(ClientData
4040: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
4050: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
4060: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69 const char *opti
4070: 6f 6e 4e 61 6d 65 2c 0a 09 54 63 6c 5f 44 53 74 onName,..Tcl_DSt
4080: 72 69 6e 67 20 2a 6f 70 74 69 6f 6e 56 61 6c 75 ring *optionValu
4090: 65 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 e) {. DigestS
40a0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
40b0: 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 (DigestState *)
40c0: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 clientData;.
40d0: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72 Tcl_Channel par
40e0: 65 6e 74 3b 0a 20 20 20 20 54 63 6c 5f 44 72 69 ent;. Tcl_Dri
40f0: 76 65 72 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 verGetOptionProc
4100: 20 2a 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 3b *getOptionProc;
4110: 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 .. /* Abort i
4120: 66 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a f no channel */.
4130: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
4140: 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 ->self == (Tcl_C
4150: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
4160: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
4170: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
4180: 20 44 65 6c 65 67 61 74 65 20 6f 70 74 69 6f 6e Delegate option
4190: 73 20 64 6f 77 6e 73 74 72 65 61 6d 20 2a 2f 0a s downstream */.
41a0: 20 20 20 20 70 61 72 65 6e 74 20 3d 20 54 63 6c parent = Tcl
41b0: 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e 6e _GetStackedChann
41c0: 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c el(statePtr->sel
41d0: 66 29 3b 0a 20 20 20 20 67 65 74 4f 70 74 69 6f f);. getOptio
41e0: 6e 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 6e nProc = Tcl_Chan
41f0: 6e 65 6c 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 nelGetOptionProc
4200: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 (Tcl_GetChannelT
4210: 79 70 65 28 70 61 72 65 6e 74 29 29 3b 0a 20 20 ype(parent));.
4220: 20 20 69 66 20 28 67 65 74 4f 70 74 69 6f 6e 50 if (getOptionP
4230: 72 6f 63 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 roc != NULL) {..
4240: 72 65 74 75 72 6e 20 28 2a 67 65 74 4f 70 74 69 return (*getOpti
4250: 6f 6e 50 72 6f 63 29 28 54 63 6c 5f 47 65 74 43 onProc)(Tcl_GetC
4260: 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 61 hannelInstanceDa
4270: 74 61 28 70 61 72 65 6e 74 29 2c 20 69 6e 74 65 ta(parent), inte
4280: 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 rp, optionName,
4290: 6f 70 74 69 6f 6e 56 61 6c 75 65 29 3b 0a 20 20 optionValue);.
42a0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6f 70 74 } else if (opt
42b0: 69 6f 6e 4e 61 6d 65 20 3d 3d 20 28 63 68 61 72 ionName == (char
42c0: 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 52 *) NULL) {../* R
42d0: 65 71 75 65 73 74 20 69 73 20 71 75 65 72 79 20 equest is query
42e0: 66 6f 72 20 61 6c 6c 20 6f 70 74 69 6f 6e 73 2c for all options,
42f0: 20 74 68 69 73 20 69 73 20 6f 6b 2e 20 2a 2f 0a this is ok. */.
4300: 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a .return TCL_OK;.
4310: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 } else {..Tc
4320: 6c 5f 53 65 74 45 72 72 6e 6f 28 45 49 4e 56 41 l_SetErrno(EINVA
4330: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 63 6c 5f L);..return Tcl_
4340: 42 61 64 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e BadChannelOption
4350: 28 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e (interp, optionN
4360: 61 6d 65 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 ame, NULL);.
4370: 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d ----------------
43c0: 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 54 69 6d . *. * DigestTim
43d0: 65 72 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a erHandler --. *.
43e0: 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65 *.Called by the
43f0: 20 6e 6f 74 69 66 69 65 72 20 76 69 61 20 74 69 notifier via ti
4400: 6d 65 72 20 74 6f 20 66 6c 75 73 68 20 6f 75 74 mer to flush out
4410: 20 70 65 6e 64 69 6e 67 20 69 6e 70 75 74 20 64 pending input d
4420: 61 74 61 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 ata.. *. * Retur
4430: 6e 73 3a 0a 20 2a 09 4e 6f 74 68 69 6e 67 0a 20 ns:. *.Nothing.
4440: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
4450: 73 3a 0a 20 2a 09 4d 61 79 20 63 61 6c 6c 20 54 s:. *.May call T
4460: 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c cl_NotifyChannel
4470: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
4480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
44a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
44b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
44c0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 44 69 67 .static void Dig
44d0: 65 73 74 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 estTimerHandler(
44e0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
44f0: 74 44 61 74 61 29 20 7b 0a 20 20 20 20 44 69 67 tData) {. Dig
4500: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 estState *stateP
4510: 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 tr = (DigestStat
4520: 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b e *) clientData;
4530: 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 .. /* Abort i
4540: 66 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a f no channel */.
4550: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
4560: 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 ->self == (Tcl_C
4570: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
4580: 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a .return;. }..
4590: 20 20 20 20 2f 2a 20 43 6c 65 61 72 20 74 69 6d /* Clear tim
45a0: 65 72 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 er token */.
45b0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 statePtr->timer
45c0: 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 = (Tcl_TimerToke
45d0: 6e 29 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a n) NULL;.. /*
45e0: 20 46 69 72 65 20 65 76 65 6e 74 20 69 66 20 74 Fire event if t
45f0: 68 65 72 65 20 69 73 20 70 65 6e 64 69 6e 67 20 here is pending
4600: 64 61 74 61 2c 20 73 6b 69 70 20 6f 74 68 65 72 data, skip other
4610: 77 69 73 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 wise */. if (
4620: 28 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68 (statePtr->watch
4630: 4d 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 41 Mask & TCL_READA
4640: 42 4c 45 29 20 26 26 20 28 54 63 6c 5f 49 6e 70 BLE) && (Tcl_Inp
4650: 75 74 42 75 66 66 65 72 65 64 28 73 74 61 74 65 utBuffered(state
4660: 50 74 72 2d 3e 73 65 6c 66 29 20 3e 20 30 29 29 Ptr->self) > 0))
4670: 20 7b 0a 09 54 63 6c 5f 4e 6f 74 69 66 79 43 68 {..Tcl_NotifyCh
4680: 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e annel(statePtr->
4690: 73 65 6c 66 2c 20 54 43 4c 5f 52 45 41 44 41 42 self, TCL_READAB
46a0: 4c 45 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a LE);. }.}../*
46b0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
46c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
4700: 44 69 67 65 73 74 57 61 74 63 68 50 72 6f 63 20 DigestWatchProc
4710: 2d 2d 0a 20 2a 0a 20 2a 09 49 6e 69 74 69 61 6c --. *. *.Initial
4720: 69 7a 65 20 74 68 65 20 6e 6f 74 69 66 69 65 72 ize the notifier
4730: 20 74 6f 20 77 61 74 63 68 20 66 6f 72 20 65 76 to watch for ev
4740: 65 6e 74 73 20 66 72 6f 6d 20 74 68 69 73 20 63 ents from this c
4750: 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 hannel.. *. * Re
4760: 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74 68 69 6e turns:. *.Nothin
4770: 67 20 28 63 61 6e 27 74 20 72 65 74 75 72 6e 20 g (can't return
4780: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 29 0a error messages).
4790: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
47a0: 74 73 3a 0a 20 2a 09 43 6f 6e 66 69 67 75 72 65 ts:. *.Configure
47b0: 20 6e 6f 74 69 66 69 65 72 20 73 6f 20 66 75 74 notifier so fut
47c0: 75 72 65 20 65 76 65 6e 74 73 20 6f 6e 20 74 68 ure events on th
47d0: 65 20 63 68 61 6e 6e 65 6c 20 77 69 6c 6c 20 62 e channel will b
47e0: 65 20 73 65 65 6e 20 62 79 20 54 63 6c 2e 0a 20 e seen by Tcl..
47f0: 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 ----------. */.v
4840: 6f 69 64 20 44 69 67 65 73 74 57 61 74 63 68 50 oid DigestWatchP
4850: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 roc(ClientData c
4860: 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 20 6d lientData, int m
4870: 61 73 6b 29 20 7b 0a 20 20 20 20 44 69 67 65 73 ask) {. Diges
4880: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 tState *statePtr
4890: 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 = (DigestState
48a0: 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 *) clientData;.
48b0: 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 Tcl_Channel p
48c0: 61 72 65 6e 74 3b 0a 20 20 20 20 54 63 6c 5f 44 arent;. Tcl_D
48d0: 72 69 76 65 72 57 61 74 63 68 50 72 6f 63 20 2a riverWatchProc *
48e0: 77 61 74 63 68 50 72 6f 63 3b 0a 0a 20 20 20 20 watchProc;..
48f0: 2f 2a 20 41 62 6f 72 74 20 69 66 20 6e 6f 20 63 /* Abort if no c
4900: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 hannel */. if
4910: 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 (statePtr->self
4920: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
4930: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 ) NULL) {..retur
4940: 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a n;. }.. /*
4950: 20 53 74 6f 72 65 20 4f 52 2d 65 64 20 63 6f 6d Store OR-ed com
4960: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f bination of TCL_
4970: 52 45 41 44 41 42 4c 45 2c 20 54 43 4c 5f 57 52 READABLE, TCL_WR
4980: 49 54 41 42 4c 45 20 61 6e 64 20 54 43 4c 5f 45 ITABLE and TCL_E
4990: 58 43 45 50 54 49 4f 4e 20 2a 2f 0a 20 20 20 20 XCEPTION */.
49a0: 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68 4d statePtr->watchM
49b0: 61 73 6b 20 3d 20 6d 61 73 6b 3b 0a 0a 20 20 20 ask = mask;..
49c0: 20 2f 2a 20 50 72 6f 70 61 67 61 74 65 20 6d 61 /* Propagate ma
49d0: 73 6b 20 69 6e 66 6f 20 74 6f 20 70 61 72 65 6e sk info to paren
49e0: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 t channel */.
49f0: 20 70 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 parent = Tcl_Ge
4a00: 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 tStackedChannel(
4a10: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b statePtr->self);
4a20: 0a 20 20 20 20 77 61 74 63 68 50 72 6f 63 20 3d . watchProc =
4a30: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 57 61 74 63 Tcl_ChannelWatc
4a40: 68 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 hProc(Tcl_GetCha
4a50: 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 6e 74 29 nnelType(parent)
4a60: 29 3b 0a 20 20 20 20 77 61 74 63 68 50 72 6f 63 );. watchProc
4a70: 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 (Tcl_GetChannelI
4a80: 6e 73 74 61 6e 63 65 44 61 74 61 28 70 61 72 65 nstanceData(pare
4a90: 6e 74 29 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20 20 nt), mask);..
4aa0: 20 2f 2a 20 52 65 6d 6f 76 65 20 70 65 6e 64 69 /* Remove pendi
4ab0: 6e 67 20 74 69 6d 65 72 20 2a 2f 0a 20 20 20 20 ng timer */.
4ac0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 if (statePtr->ti
4ad0: 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 mer != (Tcl_Time
4ae0: 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a rToken) NULL) {.
4af0: 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 .Tcl_DeleteTimer
4b00: 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 Handler(statePtr
4b10: 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 ->timer);..state
4b20: 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 Ptr->timer = (Tc
4b30: 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 l_TimerToken) NU
4b40: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f LL;. }.. /
4b50: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 64 61 * If there is da
4b60: 74 61 20 70 65 6e 64 69 6e 67 2c 20 73 65 74 20 ta pending, set
4b70: 6e 65 77 20 74 69 6d 65 72 20 74 6f 20 63 61 6c new timer to cal
4b80: 6c 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 6e l Tcl_NotifyChan
4b90: 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 nel */. if ((
4ba0: 6d 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 41 mask & TCL_READA
4bb0: 42 4c 45 29 20 26 26 20 28 54 63 6c 5f 49 6e 70 BLE) && (Tcl_Inp
4bc0: 75 74 42 75 66 66 65 72 65 64 28 73 74 61 74 65 utBuffered(state
4bd0: 50 74 72 2d 3e 73 65 6c 66 29 20 3e 20 30 29 29 Ptr->self) > 0))
4be0: 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 {..statePtr->ti
4bf0: 6d 65 72 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 mer = Tcl_Create
4c00: 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 52 45 41 TimerHandler(REA
4c10: 44 5f 44 45 4c 41 59 2c 20 44 69 67 65 73 74 54 D_DELAY, DigestT
4c20: 69 6d 65 72 48 61 6e 64 6c 65 72 2c 20 28 43 6c imerHandler, (Cl
4c30: 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 ientData) stateP
4c40: 74 72 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a tr);. }.}../*
4c50: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
4c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
4ca0: 44 69 67 65 73 74 47 65 74 48 61 6e 64 6c 65 50 DigestGetHandleP
4cb0: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c roc --. *. *.Cal
4cc0: 6c 65 64 20 66 72 6f 6d 20 54 63 6c 5f 47 65 74 led from Tcl_Get
4cd0: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 20 74 6f ChannelHandle to
4ce0: 20 72 65 74 72 69 65 76 65 20 4f 53 20 73 70 65 retrieve OS spe
4cf0: 63 69 66 69 63 20 66 69 6c 65 20 68 61 6e 64 6c cific file handl
4d00: 65 0a 20 2a 09 66 72 6f 6d 20 69 6e 73 69 64 65 e. *.from inside
4d10: 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 2e 20 4e this channel. N
4d20: 6f 74 20 75 73 65 64 20 66 6f 72 20 74 72 61 6e ot used for tran
4d30: 73 66 6f 72 6d 61 74 69 6f 6e 73 3f 0a 20 2a 0a sformations?. *.
4d40: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 * Returns:. *.T
4d50: 43 4c 5f 4f 4b 20 66 6f 72 20 73 75 63 63 65 73 CL_OK for succes
4d60: 73 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 66 s or TCL_ERROR f
4d70: 6f 72 20 65 72 72 6f 72 20 6f 72 20 69 66 20 6e or error or if n
4d80: 6f 74 20 73 75 70 70 6f 72 74 65 64 2e 20 49 66 ot supported. If
4d90: 0a 20 2a 09 64 69 72 65 63 74 69 6f 6e 20 69 73 . *.direction is
4da0: 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 2c 20 73 TCL_READABLE, s
4db0: 65 74 73 20 68 61 6e 64 6c 65 50 74 72 20 74 6f ets handlePtr to
4dc0: 20 74 68 65 20 68 61 6e 64 6c 65 20 75 73 65 64 the handle used
4dd0: 20 66 6f 72 0a 20 2a 09 69 6e 70 75 74 2c 20 6f for. *.input, o
4de0: 72 20 69 66 20 54 43 4c 5f 57 52 49 54 41 42 4c r if TCL_WRITABL
4df0: 45 20 73 65 74 73 20 74 6f 20 74 68 65 20 68 61 E sets to the ha
4e00: 6e 64 6c 65 20 75 73 65 64 20 66 6f 72 20 6f 75 ndle used for ou
4e10: 74 70 75 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 tput.. *. * Side
4e20: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
4e30: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d e. *. *---------
4e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
4e80: 2f 0a 69 6e 74 20 44 69 67 65 73 74 47 65 74 48 /.int DigestGetH
4e90: 61 6e 64 6c 65 50 72 6f 63 28 43 6c 69 65 6e 74 andleProc(Client
4ea0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
4eb0: 20 69 6e 74 20 64 69 72 65 63 74 69 6f 6e 2c 20 int direction,
4ec0: 43 6c 69 65 6e 74 44 61 74 61 20 2a 68 61 6e 64 ClientData *hand
4ed0: 6c 65 50 74 72 29 20 7b 0a 20 20 20 20 44 69 67 lePtr) {. Dig
4ee0: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 estState *stateP
4ef0: 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 tr = (DigestStat
4f00: 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b e *) clientData;
4f10: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c . Tcl_Channel
4f20: 20 70 61 72 65 6e 74 3b 0a 0a 20 20 20 20 2f 2a parent;.. /*
4f30: 20 41 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61 Abort if no cha
4f40: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 nnel */. if (
4f50: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d statePtr->self =
4f60: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
4f70: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
4f80: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
4f90: 0a 0a 20 20 20 20 70 61 72 65 6e 74 20 3d 20 54 .. parent = T
4fa0: 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 cl_GetStackedCha
4fb0: 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 nnel(statePtr->s
4fc0: 65 6c 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e elf);. return
4fd0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48 Tcl_GetChannelH
4fe0: 61 6e 64 6c 65 28 70 61 72 65 6e 74 2c 20 64 69 andle(parent, di
4ff0: 72 65 63 74 69 6f 6e 2c 20 68 61 6e 64 6c 65 50 rection, handleP
5000: 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d tr);.}../*. *---
5010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5050: 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 ---. *. * Digest
5060: 4e 6f 74 69 66 79 50 72 6f 63 20 2d 2d 0a 20 2a NotifyProc --. *
5070: 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 54 63 . *.Called by Tc
5080: 6c 20 74 6f 20 69 6e 66 6f 72 6d 20 75 73 20 6f l to inform us o
5090: 66 20 61 63 74 69 76 69 74 79 20 6f 6e 20 74 68 f activity on th
50a0: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 63 68 61 e underlying cha
50b0: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 nnel.. *. * Retu
50c0: 72 6e 73 3a 0a 20 2a 09 55 6e 63 68 61 6e 67 65 rns:. *.Unchange
50d0: 64 20 69 6e 74 65 72 65 73 74 4d 61 73 6b 20 77 d interestMask w
50e0: 68 69 63 68 20 69 73 20 61 6e 20 4f 52 2d 65 64 hich is an OR-ed
50f0: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 combination of
5100: 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 6f 72 20 TCL_READABLE or
5110: 54 43 4c 5f 57 52 49 54 41 42 4c 45 0a 20 2a 0a TCL_WRITABLE. *.
5120: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
5130: 0a 20 2a 09 43 61 6e 63 65 6c 73 20 61 6e 79 20 . *.Cancels any
5140: 70 65 6e 64 69 6e 67 20 74 69 6d 65 72 2e 0a 20 pending timer..
5150: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
5160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 ----------. */.i
51a0: 6e 74 20 44 69 67 65 73 74 4e 6f 74 69 66 79 50 nt DigestNotifyP
51b0: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 roc(ClientData c
51c0: 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 20 69 lientData, int i
51d0: 6e 74 65 72 65 73 74 4d 61 73 6b 29 20 7b 0a 20 nterestMask) {.
51e0: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a DigestState *
51f0: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 statePtr = (Dige
5200: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e stState *) clien
5210: 74 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 53 tData;.. /* S
5220: 6b 69 70 20 74 69 6d 65 72 20 65 76 65 6e 74 20 kip timer event
5230: 61 73 20 72 65 64 75 6e 64 61 6e 74 20 2a 2f 0a as redundant */.
5240: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
5250: 2d 3e 74 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f ->timer != (Tcl_
5260: 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c TimerToken) NULL
5270: 29 20 7b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 ) {..Tcl_DeleteT
5280: 69 6d 65 72 48 61 6e 64 6c 65 72 28 73 74 61 74 imerHandler(stat
5290: 65 50 74 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 ePtr->timer);..s
52a0: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d tatePtr->timer =
52b0: 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e (Tcl_TimerToken
52c0: 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 ) NULL;. }.
52d0: 20 20 72 65 74 75 72 6e 20 69 6e 74 65 72 65 73 return interes
52e0: 74 4d 61 73 6b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 0a tMask;.}../*. *.
52f0: 20 2a 20 43 68 61 6e 6e 65 6c 20 74 79 70 65 20 * Channel type
5300: 73 74 72 75 63 74 75 72 65 20 64 65 66 69 6e 69 structure defini
5310: 74 69 6f 6e 20 66 6f 72 20 64 69 67 65 73 74 20 tion for digest
5320: 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 2e transformations.
5330: 0a 20 2a 0a 20 2a 2f 0a 73 74 61 74 69 63 20 63 . *. */.static c
5340: 6f 6e 73 74 20 54 63 6c 5f 43 68 61 6e 6e 65 6c onst Tcl_Channel
5350: 54 79 70 65 20 64 69 67 65 73 74 43 68 61 6e 6e Type digestChann
5360: 65 6c 54 79 70 65 20 3d 20 7b 0a 20 20 20 20 22 elType = {. "
5370: 64 69 67 65 73 74 22 2c 09 09 09 2f 2a 20 54 79 digest",.../* Ty
5380: 70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54 pe name */. T
5390: 43 4c 5f 43 48 41 4e 4e 45 4c 5f 56 45 52 53 49 CL_CHANNEL_VERSI
53a0: 4f 4e 5f 35 2c 09 2f 2a 20 76 35 20 63 68 61 6e ON_5,./* v5 chan
53b0: 6e 65 6c 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 nel */. Diges
53c0: 74 43 6c 6f 73 65 50 72 6f 63 2c 09 09 2f 2a 20 tCloseProc,../*
53d0: 43 6c 6f 73 65 20 70 72 6f 63 20 2a 2f 0a 20 20 Close proc */.
53e0: 20 20 44 69 67 65 73 74 49 6e 70 75 74 50 72 6f DigestInputPro
53f0: 63 2c 09 09 2f 2a 20 49 6e 70 75 74 20 70 72 6f c,../* Input pro
5400: 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 4f c */. DigestO
5410: 75 74 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20 4f utputProc,../* O
5420: 75 74 70 75 74 20 70 72 6f 63 20 2a 2f 0a 20 20 utput proc */.
5430: 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 53 65 65 NULL,.../* See
5440: 6b 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 k proc */. Di
5450: 67 65 73 74 53 65 74 4f 70 74 69 6f 6e 50 72 6f gestSetOptionPro
5460: 63 2c 09 2f 2a 20 53 65 74 20 6f 70 74 69 6f 6e c,./* Set option
5470: 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 proc */. Dig
5480: 65 73 74 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 estGetOptionProc
5490: 2c 09 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 20 ,./* Get option
54a0: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 proc */. Dige
54b0: 73 74 57 61 74 63 68 50 72 6f 63 2c 09 09 2f 2a stWatchProc,../*
54c0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 6e 6f 74 69 Initialize noti
54d0: 66 69 65 72 20 2a 2f 0a 20 20 20 20 44 69 67 65 fier */. Dige
54e0: 73 74 47 65 74 48 61 6e 64 6c 65 50 72 6f 63 2c stGetHandleProc,
54f0: 09 2f 2a 20 47 65 74 20 4f 53 20 68 61 6e 64 6c ./* Get OS handl
5500: 65 73 20 6f 75 74 20 6f 66 20 63 68 61 6e 6e 65 es out of channe
5510: 6c 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 43 l */. DigestC
5520: 6c 6f 73 65 32 50 72 6f 63 2c 09 09 2f 2a 20 63 lose2Proc,../* c
5530: 6c 6f 73 65 32 70 72 6f 63 20 2a 2f 0a 20 20 20 lose2proc */.
5540: 20 44 69 67 65 73 74 42 6c 6f 63 6b 4d 6f 64 65 DigestBlockMode
5550: 50 72 6f 63 2c 09 2f 2a 20 53 65 74 20 62 6c 6f Proc,./* Set blo
5560: 63 6b 69 6e 67 2f 6e 6f 6e 62 6c 6f 63 6b 69 6e cking/nonblockin
5570: 67 20 6d 6f 64 65 2a 2f 0a 20 20 20 20 4e 55 4c g mode*/. NUL
5580: 4c 2c 09 09 09 2f 2a 20 46 6c 75 73 68 20 70 72 L,.../* Flush pr
5590: 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 oc */. Digest
55a0: 4e 6f 74 69 66 79 50 72 6f 63 2c 09 09 2f 2a 20 NotifyProc,../*
55b0: 48 61 6e 64 6c 69 6e 67 20 6f 66 20 65 76 65 6e Handling of even
55c0: 74 73 20 62 75 62 62 6c 69 6e 67 20 75 70 20 2a ts bubbling up *
55d0: 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a /. NULL,.../*
55e0: 20 57 69 64 65 20 73 65 65 6b 20 70 72 6f 63 20 Wide seek proc
55f0: 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f */. NULL,.../
5600: 2a 20 54 68 72 65 61 64 20 61 63 74 69 6f 6e 20 * Thread action
5610: 2a 2f 0a 20 20 20 20 4e 55 4c 4c 09 09 09 2f 2a */. NULL.../*
5620: 20 54 72 75 6e 63 61 74 65 20 2a 2f 0a 7d 3b 0a Truncate */.};.
5630: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
5640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
5680: 20 2a 20 44 69 67 65 73 74 43 68 61 6e 6e 65 6c * DigestChannel
5690: 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 2a Handler --. *. *
56a0: 09 43 72 65 61 74 65 20 61 20 73 74 61 63 6b 65 .Create a stacke
56b0: 64 20 63 68 61 6e 6e 65 6c 20 66 6f 72 20 61 20 d channel for a
56c0: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 74 message digest t
56d0: 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 ransformation..
56e0: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a *. * Returns:. *
56f0: 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 .TCL_OK or TCL_E
5700: 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 RROR. *. * Side
5710: 65 66 66 65 63 74 73 3a 0a 20 2a 09 41 64 64 73 effects:. *.Adds
5720: 20 74 72 61 6e 73 66 6f 72 6d 20 74 6f 20 63 68 transform to ch
5730: 61 6e 6e 65 6c 20 61 6e 64 20 73 65 74 73 20 72 annel and sets r
5740: 65 73 75 6c 74 20 74 6f 20 63 68 61 6e 6e 65 6c esult to channel
5750: 20 69 64 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 id or error mes
5760: 73 61 67 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d sage.. *. *-----
5770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
57b0: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
57c0: 20 44 69 67 65 73 74 43 68 61 6e 6e 65 6c 48 61 DigestChannelHa
57d0: 6e 64 6c 65 72 28 54 63 6c 5f 49 6e 74 65 72 70 ndler(Tcl_Interp
57e0: 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 *interp, const
57f0: 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 2c 20 54 char *channel, T
5800: 63 6c 5f 4f 62 6a 20 2a 64 69 67 65 73 74 4f 62 cl_Obj *digestOb
5810: 6a 2c 0a 09 54 63 6c 5f 4f 62 6a 20 2a 63 69 70 j,..Tcl_Obj *cip
5820: 68 65 72 4f 62 6a 2c 20 69 6e 74 20 66 6f 72 6d herObj, int form
5830: 61 74 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 at, Tcl_Obj *key
5840: 4f 62 6a 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6d 61 Obj, Tcl_Obj *ma
5850: 63 4f 62 6a 2c 20 69 6e 74 20 6c 65 6e 67 74 68 cObj, int length
5860: 29 20 7b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 ) {. int mode
5870: 3b 20 2f 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 ; /* OR-ed combi
5880: 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 nation of TCL_RE
5890: 41 44 41 42 4c 45 20 61 6e 64 20 54 43 4c 5f 57 ADABLE and TCL_W
58a0: 52 49 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 54 RITABLE */. T
58b0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b cl_Channel chan;
58c0: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 . DigestState
58d0: 20 2a 73 74 61 74 65 50 74 72 3b 0a 0a 20 20 20 *statePtr;..
58e0: 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 dprintf("Called
58f0: 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 ");.. /* Vali
5900: 64 61 74 65 20 61 72 67 73 20 2a 2f 0a 20 20 20 date args */.
5910: 20 69 66 20 28 63 68 61 6e 6e 65 6c 20 3d 3d 20 if (channel ==
5920: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 20 4e (const char *) N
5930: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 ULL) {..Tcl_Appe
5940: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
5950: 20 22 4e 6f 20 63 68 61 6e 6e 65 6c 22 2c 20 28 "No channel", (
5960: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
5970: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
5980: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
5990: 47 65 74 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a Get channel Id *
59a0: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c /. chan = Tcl
59b0: 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 65 _GetChannel(inte
59c0: 72 70 2c 20 63 68 61 6e 6e 65 6c 2c 20 26 6d 6f rp, channel, &mo
59d0: 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 68 61 de);. if (cha
59e0: 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 n == (Tcl_Channe
59f0: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
5a00: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
5a10: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 }.. /* Make
5a20: 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 74 65 sure to operate
5a30: 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 on the topmost
5a40: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 channel */. c
5a50: 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 han = Tcl_GetTop
5a60: 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a Channel(chan);..
5a70: 20 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 /* Configure
5a80: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
5a90: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
5aa0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
5ab0: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e n, "-translation
5ac0: 22 2c 20 22 62 69 6e 61 72 79 22 29 3b 0a 20 20 ", "binary");.
5ad0: 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 if (Tcl_GetCha
5ae0: 6e 6e 65 6c 42 75 66 66 65 72 53 69 7a 65 28 63 nnelBufferSize(c
5af0: 68 61 6e 29 20 3c 20 45 56 50 5f 4d 41 58 5f 4d han) < EVP_MAX_M
5b00: 44 5f 53 49 5a 45 20 2a 20 32 29 20 7b 0a 09 54 D_SIZE * 2) {..T
5b10: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 42 75 66 cl_SetChannelBuf
5b20: 66 65 72 53 69 7a 65 28 63 68 61 6e 2c 20 45 56 ferSize(chan, EV
5b30: 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 20 2a 20 P_MAX_MD_SIZE *
5b40: 32 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2);. }.. /
5b50: 2a 20 43 72 65 61 74 65 20 73 74 61 74 65 20 64 * Create state d
5b60: 61 74 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f ata structure */
5b70: 0a 20 20 20 20 69 66 20 28 28 73 74 61 74 65 50 . if ((stateP
5b80: 74 72 20 3d 20 44 69 67 65 73 74 53 74 61 74 65 tr = DigestState
5b90: 4e 65 77 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d New(interp, form
5ba0: 61 74 2c 20 6c 65 6e 67 74 68 29 29 20 3d 3d 20 at, length)) ==
5bb0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 NULL) {..Tcl_App
5bc0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
5bd0: 2c 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 , "Memory alloca
5be0: 74 69 6f 6e 20 65 72 72 6f 72 22 2c 20 28 63 68 tion error", (ch
5bf0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 ar *) NULL);..re
5c00: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
5c10: 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 }. stateP
5c20: 74 72 2d 3e 73 65 6c 66 20 3d 20 63 68 61 6e 3b tr->self = chan;
5c30: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 6d . statePtr->m
5c40: 6f 64 65 20 3d 20 6d 6f 64 65 3b 0a 0a 20 20 20 ode = mode;..
5c50: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 68 /* Initialize h
5c60: 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a ash function */.
5c70: 20 20 20 20 69 66 20 28 44 69 67 65 73 74 49 6e if (DigestIn
5c80: 69 74 69 61 6c 69 7a 65 28 69 6e 74 65 72 70 2c itialize(interp,
5c90: 20 73 74 61 74 65 50 74 72 2c 20 64 69 67 65 73 statePtr, diges
5ca0: 74 4f 62 6a 2c 20 63 69 70 68 65 72 4f 62 6a 2c tObj, cipherObj,
5cb0: 20 6b 65 79 4f 62 6a 2c 20 6d 61 63 4f 62 6a 29 keyObj, macObj)
5cc0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 44 != TCL_OK) {..D
5cd0: 69 67 65 73 74 53 74 61 74 65 46 72 65 65 28 73 igestStateFree(s
5ce0: 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 tatePtr);..retur
5cf0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
5d00: 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74 61 63 6b }.. /* Stack
5d10: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
5d20: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d statePtr->self =
5d30: 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 Tcl_StackChanne
5d40: 6c 28 69 6e 74 65 72 70 2c 20 26 64 69 67 65 73 l(interp, &diges
5d50: 74 43 68 61 6e 6e 65 6c 54 79 70 65 2c 20 28 43 tChannelType, (C
5d60: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
5d70: 50 74 72 2c 20 6d 6f 64 65 2c 20 63 68 61 6e 29 Ptr, mode, chan)
5d80: 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 ;. if (stateP
5d90: 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c tr->self == (Tcl
5da0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
5db0: 7b 0a 09 44 69 67 65 73 74 53 74 61 74 65 46 72 {..DigestStateFr
5dc0: 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a 09 72 ee(statePtr);..r
5dd0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
5de0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
5df0: 65 74 20 72 65 73 75 6c 74 20 74 6f 20 63 68 61 et result to cha
5e00: 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20 20 54 nnel Id */. T
5e10: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
5e20: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 20 54 63 erp, (char *) Tc
5e30: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 l_GetChannelName
5e40: 28 63 68 61 6e 29 2c 20 54 43 4c 5f 56 4f 4c 41 (chan), TCL_VOLA
5e50: 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72 TILE);. retur
5e60: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a n TCL_OK;.}../*.
5e70: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
5e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5eb0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 --------. *. * U
5ec0: 6e 73 74 61 63 6b 20 43 68 61 6e 6e 65 6c 20 2d nstack Channel -
5ed0: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e -. *. *.This fun
5ee0: 63 74 69 6f 6e 20 72 65 6d 6f 76 65 73 20 74 68 ction removes th
5ef0: 65 20 73 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 e stacked channe
5f00: 6c 20 66 72 6f 6d 20 74 68 65 20 74 6f 70 20 6f l from the top o
5f10: 66 20 74 68 65 0a 20 2a 09 63 68 61 6e 6e 65 6c f the. *.channel
5f20: 20 73 74 61 63 6b 20 69 66 20 69 74 20 69 73 20 stack if it is
5f30: 61 20 64 69 67 65 73 74 20 63 68 61 6e 6e 65 6c a digest channel
5f40: 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a .. *. * Returns:
5f50: 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 . *.TCL_OK or TC
5f60: 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 L_ERROR. *. * Si
5f70: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 52 de effects:. *.R
5f80: 65 6d 6f 76 65 73 20 74 72 61 6e 73 66 6f 72 6d emoves transform
5f90: 20 66 72 6f 6d 20 63 68 61 6e 6e 65 6c 20 6f 72 from channel or
5fa0: 20 73 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 sets result to
5fb0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 error message..
5fc0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
5fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 ----------. */.s
6010: 74 61 74 69 63 20 69 6e 74 20 44 69 67 65 73 74 tatic int Digest
6020: 55 6e 73 74 61 63 6b 4f 62 6a 43 6d 64 28 43 6c UnstackObjCmd(Cl
6030: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
6040: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
6050: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
6060: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
6070: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
6080: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e Tcl_Channel chan
6090: 3b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 20 ;. int mode;
60a0: 2f 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 /* OR-ed combina
60b0: 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 tion of TCL_READ
60c0: 41 42 4c 45 20 61 6e 64 20 54 43 4c 5f 57 52 49 ABLE and TCL_WRI
60d0: 54 41 42 4c 45 20 20 2a 2f 0a 20 20 20 20 28 76 TABLE */. (v
60e0: 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b oid) clientData;
60f0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
6100: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a alled");.. /*
6110: 20 56 61 6c 69 64 61 74 65 20 61 72 67 20 63 6f Validate arg co
6120: 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f unt */. if (o
6130: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c bjc != 2) {..Tcl
6140: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
6150: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
6160: 63 68 61 6e 6e 65 6c 49 64 22 29 3b 0a 09 72 65 channelId");..re
6170: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
6180: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 }.. /* Ge
6190: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 t channel */.
61a0: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 chan = Tcl_GetC
61b0: 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 hannel(interp, T
61c0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a cl_GetString(obj
61d0: 76 5b 31 5d 29 2c 20 26 6d 6f 64 65 29 3b 0a 20 v[1]), &mode);.
61e0: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 if (chan == (
61f0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
6200: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
6210: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
6220: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 /* Make sure
6230: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
6240: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
6250: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 l */. chan =
6260: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 Tcl_GetTopChanne
6270: 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a l(chan);.. /*
6280: 20 43 68 65 63 6b 20 69 66 20 64 69 67 65 73 74 Check if digest
6290: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
62a0: 69 66 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e if (Tcl_GetChann
62b0: 65 6c 54 79 70 65 28 63 68 61 6e 29 20 21 3d 20 elType(chan) !=
62c0: 26 64 69 67 65 73 74 43 68 61 6e 6e 65 6c 54 79 &digestChannelTy
62d0: 70 65 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e pe) {..Tcl_Appen
62e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
62f0: 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 5c 22 22 "bad channel \""
6300: 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c , Tcl_GetChannel
6310: 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 20 20 20 Name(chan),..
6320: 20 22 5c 22 3a 20 6e 6f 74 20 61 20 64 69 67 65 "\": not a dige
6330: 73 74 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 st channel", (ch
6340: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 54 63 ar *) NULL);..Tc
6350: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
6360: 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 55 nterp, "TLS", "U
6370: 4e 53 54 41 43 4b 22 2c 20 22 43 48 41 4e 4e 45 NSTACK", "CHANNE
6380: 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 L", "INVALID", (
6390: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
63a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
63b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
63c0: 50 6f 70 20 74 72 61 6e 73 66 6f 72 6d 20 66 72 Pop transform fr
63d0: 6f 6d 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 om channel */.
63e0: 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 55 6e 73 return Tcl_Uns
63f0: 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 tackChannel(inte
6400: 72 70 2c 20 63 68 61 6e 29 3b 0a 7d 0a 0a 2f 2a rp, chan);.}../*
6410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6450: 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d **/../*. *------
6460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
64a0: 0a 20 2a 20 44 69 67 65 73 74 49 6e 73 74 61 6e . * DigestInstan
64b0: 63 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 ceObjCmd --. *.
64c0: 2a 09 48 61 6e 64 6c 65 72 20 66 6f 72 20 64 69 *.Handler for di
64d0: 67 65 73 74 20 63 6f 6d 6d 61 6e 64 20 69 6e 73 gest command ins
64e0: 74 61 6e 63 65 73 2e 20 55 73 65 64 20 74 6f 20 tances. Used to
64f0: 61 64 64 20 64 61 74 61 20 74 6f 20 68 61 73 68 add data to hash
6500: 0a 20 2a 09 66 75 6e 63 74 69 6f 6e 20 6f 72 20 . *.function or
6510: 72 65 74 72 69 65 76 65 20 6d 65 73 73 61 67 65 retrieve message
6520: 20 64 69 67 65 73 74 2e 0a 20 2a 0a 20 2a 20 52 digest.. *. * R
6530: 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f eturns:. *.TCL_O
6540: 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 K or TCL_ERROR.
6550: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
6560: 73 3a 0a 20 2a 09 41 64 64 73 20 64 61 74 61 20 s:. *.Adds data
6570: 74 6f 20 68 61 73 68 20 6f 72 20 72 65 74 75 72 to hash or retur
6580: 6e 73 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 ns message diges
6590: 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d t. *. *---------
65a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
65b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 69 ----------. */.i
65e0: 6e 74 20 44 69 67 65 73 74 49 6e 73 74 61 6e 63 nt DigestInstanc
65f0: 65 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 eObjCmd(ClientDa
6600: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
6610: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
6620: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
6630: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
6640: 5b 5d 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 []) {. Digest
6650: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
6660: 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a = (DigestState *
6670: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 ) clientData;.
6680: 20 20 69 6e 74 20 66 6e 3b 0a 20 20 20 20 54 63 int fn;. Tc
6690: 6c 5f 53 69 7a 65 20 64 61 74 61 5f 6c 65 6e 20 l_Size data_len
66a0: 3d 20 30 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 = 0;. unsigne
66b0: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 4e d char *data = N
66c0: 55 4c 4c 3b 0a 20 20 20 20 73 74 61 74 69 63 20 ULL;. static
66d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 69 6e 73 74 const char *inst
66e0: 61 6e 63 65 5f 66 6e 73 20 5b 5d 20 3d 20 7b 20 ance_fns [] = {
66f0: 22 66 69 6e 61 6c 69 7a 65 22 2c 20 22 75 70 64 "finalize", "upd
6700: 61 74 65 22 2c 20 4e 55 4c 4c 20 7d 3b 0a 0a 20 ate", NULL };..
6710: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
6720: 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 ed");.. /* Va
6730: 6c 69 64 61 74 65 20 61 72 67 20 63 6f 75 6e 74 lidate arg count
6740: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 */. if (objc
6750: 20 3c 20 32 20 7c 7c 20 6f 62 6a 63 20 3e 20 33 < 2 || objc > 3
6760: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
6770: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
6780: 20 6f 62 6a 76 2c 20 22 66 75 6e 63 74 69 6f 6e objv, "function
6790: 20 3f 64 61 74 61 3f 22 29 3b 0a 09 72 65 74 75 ?data?");..retu
67a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
67b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 }.. /* Get
67c0: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 function */.
67d0: 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 if (Tcl_GetIndex
67e0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 FromObj(interp,
67f0: 6f 62 6a 76 5b 31 5d 2c 20 69 6e 73 74 61 6e 63 objv[1], instanc
6800: 65 5f 66 6e 73 2c 20 22 66 75 6e 63 74 69 6f 6e e_fns, "function
6810: 22 2c 20 30 2c 20 26 66 6e 29 20 21 3d 20 54 43 ", 0, &fn) != TC
6820: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 L_OK) {..return
6830: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
6840: 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 66 75 6e 63 .. /* Do func
6850: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 tion */. if (
6860: 66 6e 29 20 7b 0a 09 2f 2a 20 47 65 74 20 64 61 fn) {../* Get da
6870: 74 61 20 6f 72 20 72 65 74 75 72 6e 20 65 72 72 ta or return err
6880: 6f 72 20 69 66 20 6e 6f 6e 65 20 2a 2f 0a 09 69 or if none */..i
6890: 66 20 28 6f 62 6a 63 20 3d 3d 20 33 29 20 7b 0a f (objc == 3) {.
68a0: 09 20 20 20 20 64 61 74 61 20 3d 20 54 63 6c 5f . data = Tcl_
68b0: 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d GetByteArrayFrom
68c0: 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 64 61 Obj(objv[2], &da
68d0: 74 61 5f 6c 65 6e 29 3b 0a 09 7d 20 65 6c 73 65 ta_len);..} else
68e0: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 57 72 6f 6e {.. Tcl_Wron
68f0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
6900: 20 31 2c 20 6f 62 6a 76 2c 20 22 75 70 64 61 74 1, objv, "updat
6910: 65 20 64 61 74 61 22 29 3b 0a 09 20 20 20 20 72 e data");.. r
6920: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
6930: 0a 09 7d 0a 0a 09 2f 2a 20 55 70 64 61 74 65 20 ..}.../* Update
6940: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f hash function */
6950: 0a 09 69 66 20 28 44 69 67 65 73 74 55 70 64 61 ..if (DigestUpda
6960: 74 65 28 73 74 61 74 65 50 74 72 2c 20 28 63 68 te(statePtr, (ch
6970: 61 72 20 2a 29 20 64 61 74 61 2c 20 64 61 74 61 ar *) data, data
6980: 5f 6c 65 6e 2c 20 31 29 20 21 3d 20 54 43 4c 5f _len, 1) != TCL_
6990: 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 OK) {.. retur
69a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
69b0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f . } else {../
69c0: 2a 20 46 69 6e 61 6c 69 7a 65 20 68 61 73 68 20 * Finalize hash
69d0: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 63 61 6c function and cal
69e0: 63 75 6c 61 74 65 20 6d 65 73 73 61 67 65 20 64 culate message d
69f0: 69 67 65 73 74 20 2a 2f 0a 09 69 66 20 28 44 69 igest */..if (Di
6a00: 67 65 73 74 46 69 6e 61 6c 69 7a 65 28 69 6e 74 gestFinalize(int
6a10: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 4e erp, statePtr, N
6a20: 55 4c 4c 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 ULL) != TCL_OK)
6a30: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 {.. return TC
6a40: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 54 63 L_ERROR;..}...Tc
6a50: 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 46 l_DeleteCommandF
6a60: 72 6f 6d 54 6f 6b 65 6e 28 69 6e 74 65 72 70 2c romToken(interp,
6a70: 20 73 74 61 74 65 50 74 72 2d 3e 74 6f 6b 65 6e statePtr->token
6a80: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 );. }. ret
6a90: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f urn TCL_OK;.}../
6aa0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
6ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ae0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 -------. *. * Di
6af0: 67 65 73 74 43 6f 6d 6d 61 6e 64 44 65 6c 65 74 gestCommandDelet
6b00: 65 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 eHandler --. *.
6b10: 2a 09 20 43 61 6c 6c 62 61 63 6b 20 74 6f 20 63 *. Callback to c
6b20: 6c 65 61 6e 2d 75 70 20 77 68 65 6e 20 64 69 67 lean-up when dig
6b30: 65 73 74 20 69 6e 73 74 61 6e 63 65 20 63 6f 6d est instance com
6b40: 6d 61 6e 64 20 69 73 20 64 65 6c 65 74 65 64 2e mand is deleted.
6b50: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a . *. * Returns:.
6b60: 20 2a 09 4e 6f 74 68 69 6e 67 0a 20 2a 0a 20 2a *.Nothing. *. *
6b70: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
6b80: 2a 09 44 65 73 74 72 6f 79 73 20 73 74 61 74 65 *.Destroys state
6b90: 20 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65 0a info structure.
6ba0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
6bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6be0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 --------. */.voi
6bf0: 64 20 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 44 d DigestCommandD
6c00: 65 6c 65 74 65 48 61 6e 64 6c 65 72 28 43 6c 69 eleteHandler(Cli
6c10: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
6c20: 74 61 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 ta) {. Digest
6c30: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
6c40: 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a = (DigestState *
6c50: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 ) clientData;..
6c60: 20 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20 2a /* Clean-up *
6c70: 2f 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 /. DigestStat
6c80: 65 46 72 65 65 28 73 74 61 74 65 50 74 72 29 3b eFree(statePtr);
6c90: 0a 7d 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
6ce0: 20 2a 20 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 * DigestCommand
6cf0: 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 2a Handler --. *. *
6d00: 09 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 . Create command
6d10: 20 74 6f 20 61 6c 6c 6f 77 20 75 73 65 72 20 74 to allow user t
6d20: 6f 20 61 64 64 20 64 61 74 61 20 74 6f 20 68 61 o add data to ha
6d30: 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a sh function.. *.
6d40: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 * Returns:. *.T
6d50: 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 CL_OK or TCL_ERR
6d60: 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 OR. *. * Side ef
6d70: 66 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 fects:. *.Create
6d80: 73 20 63 6f 6d 6d 61 6e 64 20 6f 72 20 65 72 72 s command or err
6d90: 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a or message. *. *
6da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6de0: 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 ---. */.int Dige
6df0: 73 74 43 6f 6d 6d 61 6e 64 48 61 6e 64 6c 65 72 stCommandHandler
6e00: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 (Tcl_Interp *int
6e10: 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d erp, Tcl_Obj *cm
6e20: 64 4f 62 6a 2c 20 54 63 6c 5f 4f 62 6a 20 2a 64 dObj, Tcl_Obj *d
6e30: 69 67 65 73 74 4f 62 6a 2c 0a 09 54 63 6c 5f 4f igestObj,..Tcl_O
6e40: 62 6a 20 2a 63 69 70 68 65 72 4f 62 6a 2c 20 69 bj *cipherObj, i
6e50: 6e 74 20 66 6f 72 6d 61 74 2c 20 54 63 6c 5f 4f nt format, Tcl_O
6e60: 62 6a 20 2a 6b 65 79 4f 62 6a 2c 20 54 63 6c 5f bj *keyObj, Tcl_
6e70: 4f 62 6a 20 2a 6d 61 63 4f 62 6a 2c 20 69 6e 74 Obj *macObj, int
6e80: 20 6c 65 6e 67 74 68 29 20 7b 0a 20 20 20 20 44 length) {. D
6e90: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 igestState *stat
6ea0: 65 50 74 72 3b 0a 20 20 20 20 63 68 61 72 20 2a ePtr;. char *
6eb0: 63 6d 64 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 cmdName = Tcl_Ge
6ec0: 74 53 74 72 69 6e 67 28 63 6d 64 4f 62 6a 29 3b tString(cmdObj);
6ed0: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 .. dprintf("C
6ee0: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a alled");.. /*
6ef0: 20 43 72 65 61 74 65 20 73 74 61 74 65 20 64 61 Create state da
6f00: 74 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a ta structure */.
6f10: 20 20 20 20 69 66 20 28 28 73 74 61 74 65 50 74 if ((statePt
6f20: 72 20 3d 20 44 69 67 65 73 74 53 74 61 74 65 4e r = DigestStateN
6f30: 65 77 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61 ew(interp, forma
6f40: 74 2c 20 6c 65 6e 67 74 68 29 29 20 3d 3d 20 4e t, length)) == N
6f50: 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 ULL) {..Tcl_Appe
6f60: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
6f70: 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 "Memory allocat
6f80: 69 6f 6e 20 65 72 72 6f 72 22 2c 20 28 63 68 61 ion error", (cha
6f90: 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 r *) NULL);..ret
6fa0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
6fb0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 69 }.. /* Ini
6fc0: 74 69 61 6c 69 7a 65 20 68 61 73 68 20 66 75 6e tialize hash fun
6fd0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 ction */. if
6fe0: 28 44 69 67 65 73 74 49 6e 69 74 69 61 6c 69 7a (DigestInitializ
6ff0: 65 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 e(interp, stateP
7000: 74 72 2c 20 64 69 67 65 73 74 4f 62 6a 2c 20 63 tr, digestObj, c
7010: 69 70 68 65 72 4f 62 6a 2c 20 6b 65 79 4f 62 6a ipherObj, keyObj
7020: 2c 20 6d 61 63 4f 62 6a 29 20 21 3d 20 54 43 4c , macObj) != TCL
7030: 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 _OK) {..return T
7040: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
7050: 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 69 . /* Create i
7060: 6e 73 74 61 6e 63 65 20 63 6f 6d 6d 61 6e 64 20 nstance command
7070: 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d */. statePtr-
7080: 3e 74 6f 6b 65 6e 20 3d 20 54 63 6c 5f 43 72 65 >token = Tcl_Cre
7090: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
70a0: 74 65 72 70 2c 20 63 6d 64 4e 61 6d 65 2c 20 44 terp, cmdName, D
70b0: 69 67 65 73 74 49 6e 73 74 61 6e 63 65 4f 62 6a igestInstanceObj
70c0: 43 6d 64 2c 0a 09 28 43 6c 69 65 6e 74 44 61 74 Cmd,..(ClientDat
70d0: 61 29 20 73 74 61 74 65 50 74 72 2c 20 44 69 67 a) statePtr, Dig
70e0: 65 73 74 43 6f 6d 6d 61 6e 64 44 65 6c 65 74 65 estCommandDelete
70f0: 48 61 6e 64 6c 65 72 29 3b 0a 20 20 20 20 69 66 Handler);. if
7100: 20 28 73 74 61 74 65 50 74 72 2d 3e 74 6f 6b 65 (statePtr->toke
7110: 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 44 69 n == NULL) {..Di
7120: 67 65 73 74 53 74 61 74 65 46 72 65 65 28 73 74 gestStateFree(st
7130: 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e atePtr);..return
7140: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
7150: 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 74 75 72 6e }.. /* Return
7160: 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f command name */
7170: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
7180: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 63 6d esult(interp, cm
7190: 64 4f 62 6a 29 3b 0a 20 20 20 20 72 65 74 75 72 dObj);. retur
71a0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a n TCL_OK;.}.../*
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 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
71f0: 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 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: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
7240: 0a 20 2a 20 44 69 67 65 73 74 44 61 74 61 48 61 . * DigestDataHa
7250: 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 2a 09 52 ndler --. *. *.R
7260: 65 74 75 72 6e 20 6d 65 73 73 61 67 65 20 64 69 eturn message di
7270: 67 65 73 74 20 66 6f 72 20 64 61 74 61 20 75 73 gest for data us
7280: 69 6e 67 20 75 73 65 72 20 73 70 65 63 69 66 69 ing user specifi
7290: 65 64 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e ed hash function
72a0: 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a .. *. * Returns:
72b0: 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 . *.TCL_OK or TC
72c0: 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 L_ERROR. *. * Si
72d0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 de effects:. *.S
72e0: 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 6d 65 ets result to me
72f0: 73 73 61 67 65 20 64 69 67 65 73 74 20 6f 72 20 ssage digest or
7300: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a error message. *
7310: 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7350: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 ------. */.int D
7360: 69 67 65 73 74 44 61 74 61 48 61 6e 64 6c 65 72 igestDataHandler
7370: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 (Tcl_Interp *int
7380: 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 64 61 erp, Tcl_Obj *da
7390: 74 61 4f 62 6a 2c 20 54 63 6c 5f 4f 62 6a 20 2a taObj, Tcl_Obj *
73a0: 64 69 67 65 73 74 4f 62 6a 2c 0a 09 54 63 6c 5f digestObj,..Tcl_
73b0: 4f 62 6a 20 2a 63 69 70 68 65 72 4f 62 6a 2c 20 Obj *cipherObj,
73c0: 69 6e 74 20 66 6f 72 6d 61 74 2c 20 54 63 6c 5f int format, Tcl_
73d0: 4f 62 6a 20 2a 6b 65 79 4f 62 6a 2c 20 54 63 6c Obj *keyObj, Tcl
73e0: 5f 4f 62 6a 20 2a 6d 61 63 4f 62 6a 2c 20 69 6e _Obj *macObj, in
73f0: 74 20 6c 65 6e 67 74 68 29 20 7b 0a 20 20 20 20 t length) {.
7400: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 unsigned char *d
7410: 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a ata;. Tcl_Siz
7420: 65 20 64 61 74 61 5f 6c 65 6e 3b 0a 20 20 20 20 e data_len;.
7430: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 DigestState *sta
7440: 74 65 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 69 tePtr;.. dpri
7450: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
7460: 20 20 20 20 2f 2a 20 47 65 74 20 64 61 74 61 20 /* Get data
7470: 2a 2f 0a 20 20 20 20 64 61 74 61 20 3d 20 54 63 */. data = Tc
7480: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 l_GetByteArrayFr
7490: 6f 6d 4f 62 6a 28 64 61 74 61 4f 62 6a 2c 20 26 omObj(dataObj, &
74a0: 64 61 74 61 5f 6c 65 6e 29 3b 0a 20 20 20 20 69 data_len);. i
74b0: 66 20 28 64 61 74 61 20 3d 3d 20 4e 55 4c 4c 29 f (data == NULL)
74c0: 20 7b 0a 09 54 63 6c 5f 53 65 74 52 65 73 75 6c {..Tcl_SetResul
74d0: 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 64 61 t(interp, "No da
74e0: 74 61 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 ta", NULL);..ret
74f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
7500: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 }.. /* Cre
7510: 61 74 65 20 73 74 61 74 65 20 64 61 74 61 20 73 ate state data s
7520: 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 tructure */.
7530: 69 66 20 28 28 73 74 61 74 65 50 74 72 20 3d 20 if ((statePtr =
7540: 44 69 67 65 73 74 53 74 61 74 65 4e 65 77 28 69 DigestStateNew(i
7550: 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74 2c 20 6c nterp, format, l
7560: 65 6e 67 74 68 29 29 20 3d 3d 20 4e 55 4c 4c 29 ength)) == NULL)
7570: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
7580: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4d 65 sult(interp, "Me
7590: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 mory allocation
75a0: 65 72 72 6f 72 22 2c 20 28 63 68 61 72 20 2a 29 error", (char *)
75b0: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
75c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
75d0: 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 63 20 44 69 .. /* Calc Di
75e0: 67 65 73 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 gest */. if (
75f0: 44 69 67 65 73 74 49 6e 69 74 69 61 6c 69 7a 65 DigestInitialize
7600: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
7610: 72 2c 20 64 69 67 65 73 74 4f 62 6a 2c 20 63 69 r, digestObj, ci
7620: 70 68 65 72 4f 62 6a 2c 20 6b 65 79 4f 62 6a 2c pherObj, keyObj,
7630: 20 6d 61 63 4f 62 6a 29 20 21 3d 20 54 43 4c 5f macObj) != TCL_
7640: 4f 4b 20 7c 7c 0a 09 44 69 67 65 73 74 55 70 64 OK ||..DigestUpd
7650: 61 74 65 28 73 74 61 74 65 50 74 72 2c 20 28 63 ate(statePtr, (c
7660: 68 61 72 20 2a 29 20 64 61 74 61 2c 20 64 61 74 har *) data, dat
7670: 61 5f 6c 65 6e 2c 20 31 29 20 21 3d 20 54 43 4c a_len, 1) != TCL
7680: 5f 4f 4b 20 7c 7c 0a 09 44 69 67 65 73 74 46 69 _OK ||..DigestFi
7690: 6e 61 6c 69 7a 65 28 69 6e 74 65 72 70 2c 20 73 nalize(interp, s
76a0: 74 61 74 65 50 74 72 2c 20 4e 55 4c 4c 29 20 21 tatePtr, NULL) !
76b0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 44 69 67 = TCL_OK) {..Dig
76c0: 65 73 74 53 74 61 74 65 46 72 65 65 28 73 74 61 estStateFree(sta
76d0: 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 tePtr);..return
76e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
76f0: 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 .. /* Clean-u
7700: 70 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 53 p */. DigestS
7710: 74 61 74 65 46 72 65 65 28 73 74 61 74 65 50 74 tateFree(statePt
7720: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 r);. return T
7730: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a CL_OK;.}../*****
7740: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a **************/.
7780: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
7790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
77a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
77b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
77c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
77d0: 44 69 67 65 73 74 46 69 6c 65 48 61 6e 64 6c 65 DigestFileHandle
77e0: 72 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 r --. *. *.Retur
77f0: 6e 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 n message digest
7800: 20 66 6f 72 20 66 69 6c 65 20 75 73 69 6e 67 20 for file using
7810: 75 73 65 72 20 73 70 65 63 69 66 69 65 64 20 68 user specified h
7820: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a ash function.. *
7830: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 . * Returns:. *.
7840: 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 TCL_OK or TCL_ER
7850: 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ROR. *. * Side e
7860: 66 66 65 63 74 73 3a 0a 20 2a 09 52 65 73 75 6c ffects:. *.Resul
7870: 74 20 69 73 20 6d 65 73 73 61 67 65 20 64 69 67 t is message dig
7880: 65 73 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 est or error mes
7890: 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d sage. *. *------
78a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
78b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
78c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
78d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
78e0: 2f 0a 69 6e 74 20 44 69 67 65 73 74 46 69 6c 65 /.int DigestFile
78f0: 48 61 6e 64 6c 65 72 28 54 63 6c 5f 49 6e 74 65 Handler(Tcl_Inte
7900: 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f rp *interp, Tcl_
7910: 4f 62 6a 20 2a 69 6e 46 69 6c 65 4f 62 6a 2c 20 Obj *inFileObj,
7920: 54 63 6c 5f 4f 62 6a 20 2a 64 69 67 65 73 74 4f Tcl_Obj *digestO
7930: 62 6a 2c 0a 09 54 63 6c 5f 4f 62 6a 20 2a 63 69 bj,..Tcl_Obj *ci
7940: 70 68 65 72 4f 62 6a 2c 20 69 6e 74 20 66 6f 72 pherObj, int for
7950: 6d 61 74 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 mat, Tcl_Obj *ke
7960: 79 4f 62 6a 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6d yObj, Tcl_Obj *m
7970: 61 63 4f 62 6a 2c 20 69 6e 74 20 6c 65 6e 67 74 acObj, int lengt
7980: 68 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 h) {. DigestS
7990: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a tate *statePtr;.
79a0: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
79b0: 63 68 61 6e 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 chan = NULL;.
79c0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 62 unsigned char b
79d0: 75 66 5b 42 55 46 46 45 52 5f 53 49 5a 45 5d 3b uf[BUFFER_SIZE];
79e0: 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 54 . int res = T
79f0: 43 4c 5f 4f 4b 3b 0a 0a 20 20 20 20 64 70 72 69 CL_OK;.. dpri
7a00: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
7a10: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 73 74 /* Create st
7a20: 61 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75 ate data structu
7a30: 72 65 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 73 re */. if ((s
7a40: 74 61 74 65 50 74 72 20 3d 20 44 69 67 65 73 74 tatePtr = Digest
7a50: 53 74 61 74 65 4e 65 77 28 69 6e 74 65 72 70 2c StateNew(interp,
7a60: 20 66 6f 72 6d 61 74 2c 20 6c 65 6e 67 74 68 29 format, length)
7a70: 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 ) == NULL) {..Tc
7a80: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
7a90: 6e 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20 61 nterp, "Memory a
7aa0: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 22 llocation error"
7ab0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
7ac0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
7ad0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
7ae0: 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 63 68 61 /* Open file cha
7af0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
7b00: 20 3d 20 54 63 6c 5f 46 53 4f 70 65 6e 46 69 6c = Tcl_FSOpenFil
7b10: 65 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c eChannel(interp,
7b20: 20 69 6e 46 69 6c 65 4f 62 6a 2c 20 22 72 62 22 inFileObj, "rb"
7b30: 2c 20 30 34 34 34 29 3b 0a 20 20 20 20 69 66 20 , 0444);. if
7b40: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 (chan == (Tcl_Ch
7b50: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
7b60: 44 69 67 65 73 74 53 74 61 74 65 46 72 65 65 28 DigestStateFree(
7b70: 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 statePtr);..retu
7b80: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
7b90: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e 66 }.. /* Conf
7ba0: 69 67 75 72 65 20 63 68 61 6e 6e 65 6c 20 2a 2f igure channel */
7bb0: 0a 20 20 20 20 69 66 20 28 28 72 65 73 20 3d 20 . if ((res =
7bc0: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 Tcl_SetChannelOp
7bd0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 tion(interp, cha
7be0: 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e n, "-translation
7bf0: 22 2c 20 22 62 69 6e 61 72 79 22 29 29 20 21 3d ", "binary")) !=
7c00: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 67 6f 74 6f TCL_OK) {..goto
7c10: 20 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 done;. }.
7c20: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 42 Tcl_SetChannelB
7c30: 75 66 66 65 72 53 69 7a 65 28 63 68 61 6e 2c 20 ufferSize(chan,
7c40: 42 55 46 46 45 52 5f 53 49 5a 45 29 3b 0a 0a 20 BUFFER_SIZE);..
7c50: 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 /* Initialize
7c60: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a hash function *
7c70: 2f 0a 20 20 20 20 69 66 20 28 28 72 65 73 20 3d /. if ((res =
7c80: 20 44 69 67 65 73 74 49 6e 69 74 69 61 6c 69 7a DigestInitializ
7c90: 65 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 e(interp, stateP
7ca0: 74 72 2c 20 64 69 67 65 73 74 4f 62 6a 2c 20 63 tr, digestObj, c
7cb0: 69 70 68 65 72 4f 62 6a 2c 20 6b 65 79 4f 62 6a ipherObj, keyObj
7cc0: 2c 20 6d 61 63 4f 62 6a 29 29 20 21 3d 20 54 43 , macObj)) != TC
7cd0: 4c 5f 4f 4b 29 20 7b 0a 09 67 6f 74 6f 20 64 6f L_OK) {..goto do
7ce0: 6e 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ne;. }.. /
7cf0: 2a 20 52 65 61 64 20 66 69 6c 65 20 64 61 74 61 * Read file data
7d00: 20 61 6e 64 20 75 70 64 61 74 65 20 68 61 73 68 and update hash
7d10: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 function */.
7d20: 20 77 68 69 6c 65 20 28 21 54 63 6c 5f 45 6f 66 while (!Tcl_Eof
7d30: 28 63 68 61 6e 29 29 20 7b 0a 09 54 63 6c 5f 53 (chan)) {..Tcl_S
7d40: 69 7a 65 20 6c 65 6e 20 3d 20 54 63 6c 5f 52 65 ize len = Tcl_Re
7d50: 61 64 52 61 77 28 63 68 61 6e 2c 20 28 63 68 61 adRaw(chan, (cha
7d60: 72 20 2a 29 20 62 75 66 2c 20 42 55 46 46 45 52 r *) buf, BUFFER
7d70: 5f 53 49 5a 45 29 3b 0a 09 69 66 20 28 6c 65 6e _SIZE);..if (len
7d80: 20 3e 20 30 29 20 7b 0a 09 20 20 20 20 69 66 20 > 0) {.. if
7d90: 28 28 72 65 73 20 3d 20 44 69 67 65 73 74 55 70 ((res = DigestUp
7da0: 64 61 74 65 28 73 74 61 74 65 50 74 72 2c 20 28 date(statePtr, (
7db0: 63 68 61 72 20 2a 29 20 26 62 75 66 5b 30 5d 2c char *) &buf[0],
7dc0: 20 6c 65 6e 2c 20 31 29 29 20 21 3d 20 54 43 4c len, 1)) != TCL
7dd0: 5f 4f 4b 29 20 7b 0a 09 09 67 6f 74 6f 20 64 6f _OK) {...goto do
7de0: 6e 65 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 ne;.. }..}.
7df0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 }.. /* Fina
7e00: 6c 69 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69 lize hash functi
7e10: 6f 6e 20 61 6e 64 20 63 61 6c 63 75 6c 61 74 65 on and calculate
7e20: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 message digest
7e30: 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 44 69 67 */. res = Dig
7e40: 65 73 74 46 69 6e 61 6c 69 7a 65 28 69 6e 74 65 estFinalize(inte
7e50: 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 4e 55 rp, statePtr, NU
7e60: 4c 4c 29 3b 0a 0a 64 6f 6e 65 3a 0a 20 20 20 20 LL);..done:.
7e70: 2f 2a 20 43 6c 6f 73 65 20 63 68 61 6e 6e 65 6c /* Close channel
7e80: 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f */. if (Tcl_
7e90: 43 6c 6f 73 65 28 69 6e 74 65 72 70 2c 20 63 68 Close(interp, ch
7ea0: 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 an) == TCL_ERROR
7eb0: 29 20 7b 0a 09 72 65 73 20 3d 20 54 43 4c 5f 45 ) {..res = TCL_E
7ec0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
7ed0: 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20 2a 2f 0a /* Clean-up */.
7ee0: 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 46 DigestStateF
7ef0: 72 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a 20 ree(statePtr);.
7f00: 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d return res;.}
7f10: 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ../*************
7f20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7f30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7f40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7f50: 2a 2a 2a 2a 2a 2a 2f 0a 0a 73 74 61 74 69 63 20 ******/..static
7f60: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6f 6d 6d const char *comm
7f70: 61 6e 64 5f 6f 70 74 73 20 5b 5d 20 3d 20 7b 20 and_opts [] = {
7f80: 22 2d 62 69 6e 22 2c 20 22 2d 62 69 6e 61 72 79 "-bin", "-binary
7f90: 22 2c 20 22 2d 68 65 78 22 2c 20 22 2d 68 65 78 ", "-hex", "-hex
7fa0: 61 64 65 63 69 6d 61 6c 22 2c 0a 20 20 20 20 22 adecimal",. "
7fb0: 2d 63 68 61 6e 22 2c 20 22 2d 63 68 61 6e 6e 65 -chan", "-channe
7fc0: 6c 22 2c 20 22 2d 63 69 70 68 65 72 22 2c 20 22 l", "-cipher", "
7fd0: 2d 63 6f 6d 6d 61 6e 64 22 2c 20 22 2d 64 61 74 -command", "-dat
7fe0: 61 22 2c 20 22 2d 64 69 67 65 73 74 22 2c 20 22 a", "-digest", "
7ff0: 2d 66 69 6c 65 22 2c 20 22 2d 66 69 6c 65 6e 61 -file", "-filena
8000: 6d 65 22 2c 0a 20 20 20 20 22 2d 68 61 73 68 22 me",. "-hash"
8010: 2c 20 22 2d 6b 65 79 22 2c 20 22 2d 6c 65 6e 67 , "-key", "-leng
8020: 74 68 22 2c 20 22 2d 6d 61 63 22 2c 20 22 2d 73 th", "-mac", "-s
8030: 69 7a 65 22 2c 20 4e 55 4c 4c 7d 3b 0a 0a 65 6e ize", NULL};..en
8040: 75 6d 20 5f 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 um _command_opts
8050: 20 7b 0a 20 20 20 20 5f 6f 70 74 5f 62 69 6e 2c {. _opt_bin,
8060: 20 5f 6f 70 74 5f 62 69 6e 61 72 79 2c 20 5f 6f _opt_binary, _o
8070: 70 74 5f 68 65 78 2c 20 5f 6f 70 74 5f 68 65 78 pt_hex, _opt_hex
8080: 61 64 65 63 69 6d 61 6c 2c 20 5f 6f 70 74 5f 63 adecimal, _opt_c
8090: 68 61 6e 2c 20 5f 6f 70 74 5f 63 68 61 6e 6e 65 han, _opt_channe
80a0: 6c 2c 20 5f 6f 70 74 5f 63 69 70 68 65 72 2c 0a l, _opt_cipher,.
80b0: 20 20 20 20 5f 6f 70 74 5f 63 6f 6d 6d 61 6e 64 _opt_command
80c0: 2c 20 5f 6f 70 74 5f 64 61 74 61 2c 20 5f 6f 70 , _opt_data, _op
80d0: 74 5f 64 69 67 65 73 74 2c 20 5f 6f 70 74 5f 66 t_digest, _opt_f
80e0: 69 6c 65 2c 20 5f 6f 70 74 5f 66 69 6c 65 6e 61 ile, _opt_filena
80f0: 6d 65 2c 20 5f 6f 70 74 5f 68 61 73 68 2c 20 5f me, _opt_hash, _
8100: 6f 70 74 5f 6b 65 79 2c 0a 20 20 20 20 5f 6f 70 opt_key,. _op
8110: 74 5f 6c 65 6e 67 74 68 2c 20 5f 6f 70 74 5f 6d t_length, _opt_m
8120: 61 63 2c 20 5f 6f 70 74 5f 73 69 7a 65 0a 7d 3b ac, _opt_size.};
8130: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
8140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
8180: 20 44 69 67 65 73 74 4d 61 69 6e 20 2d 2d 0a 20 DigestMain --.
8190: 2a 0a 20 2a 09 52 65 74 75 72 6e 20 6d 65 73 73 *. *.Return mess
81a0: 61 67 65 20 64 69 67 65 73 74 20 6f 72 20 4d 65 age digest or Me
81b0: 73 73 61 67 65 20 41 75 74 68 65 6e 74 69 63 61 ssage Authentica
81c0: 74 69 6f 6e 20 43 6f 64 65 20 28 4d 41 43 29 20 tion Code (MAC)
81d0: 6f 66 0a 20 2a 09 64 61 74 61 20 75 73 69 6e 67 of. *.data using
81e0: 20 75 73 65 72 20 73 70 65 63 69 66 69 65 64 20 user specified
81f0: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 hash function..
8200: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a *. * Returns:. *
8210: 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 .TCL_OK or TCL_E
8220: 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 RROR. *. * Side
8230: 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 effects:. *.Sets
8240: 20 72 65 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 result to messa
8250: 67 65 20 64 69 67 65 73 74 20 6f 72 20 65 72 72 ge digest or err
8260: 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a or message. *. *
8270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
82a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
82b0: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
82c0: 6e 74 20 44 69 67 65 73 74 4d 61 69 6e 28 69 6e nt DigestMain(in
82d0: 74 20 74 79 70 65 2c 20 54 63 6c 5f 49 6e 74 65 t type, Tcl_Inte
82e0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
82f0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
8300: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
8310: 20 20 20 69 6e 74 20 66 6f 72 6d 61 74 20 3d 20 int format =
8320: 48 45 58 5f 46 4f 52 4d 41 54 3b 20 2f 2a 20 4f HEX_FORMAT; /* O
8330: 75 74 70 75 74 20 66 6f 72 6d 61 74 20 2a 2f 0a utput format */.
8340: 20 20 20 20 69 6e 74 20 6c 65 6e 67 74 68 20 3d int length =
8350: 20 30 3b 20 2f 2a 20 4d 44 20 6c 65 6e 67 74 68 0; /* MD length
8360: 2c 20 77 68 65 72 65 20 30 3d 64 65 66 61 75 6c , where 0=defaul
8370: 74 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 69 6e t size */. in
8380: 74 20 73 74 61 72 74 20 3d 20 31 2c 20 72 65 73 t start = 1, res
8390: 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 54 = TCL_OK;. T
83a0: 63 6c 5f 53 69 7a 65 20 66 6e 3b 0a 20 20 20 20 cl_Size fn;.
83b0: 54 63 6c 5f 4f 62 6a 20 2a 63 69 70 68 65 72 4f Tcl_Obj *cipherO
83c0: 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 63 6d 64 4f bj = NULL, *cmdO
83d0: 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 64 61 74 61 bj = NULL, *data
83e0: 4f 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 64 69 67 Obj = NULL, *dig
83f0: 65 73 74 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 estObj = NULL;.
8400: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 66 69 6c 65 Tcl_Obj *file
8410: 4f 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 6b 65 79 Obj = NULL, *key
8420: 4f 62 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 6d 61 63 Obj = NULL, *mac
8430: 4f 62 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 Obj = NULL;.
8440: 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 68 61 6e const char *chan
8450: 6e 65 6c 20 3d 20 4e 55 4c 4c 2c 20 2a 6f 70 74 nel = NULL, *opt
8460: 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 ;.. dprintf("
8470: 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f Called");.. /
8480: 2a 20 43 6c 65 61 72 20 69 6e 74 65 72 70 20 72 * Clear interp r
8490: 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 54 63 6c esult */. Tcl
84a0: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 _ResetResult(int
84b0: 65 72 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 erp);.. /* Va
84c0: 6c 69 64 61 74 65 20 61 72 67 20 63 6f 75 6e 74 lidate arg count
84d0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 */. if (objc
84e0: 20 3c 20 33 20 7c 7c 20 6f 62 6a 63 20 3e 20 31 < 3 || objc > 1
84f0: 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 2) {..Tcl_WrongN
8500: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 umArgs(interp, 1
8510: 2c 20 6f 62 6a 76 2c 20 22 3f 2d 62 69 6e 7c 2d , objv, "?-bin|-
8520: 68 65 78 3f 20 3f 2d 63 69 70 68 65 72 20 6e 61 hex? ?-cipher na
8530: 6d 65 3f 20 3f 2d 64 69 67 65 73 74 20 6e 61 6d me? ?-digest nam
8540: 65 3f 20 3f 2d 6b 65 79 20 6b 65 79 3f 20 3f 2d e? ?-key key? ?-
8550: 6d 61 63 20 6e 61 6d 65 3f 20 5b 2d 63 68 61 6e mac name? [-chan
8560: 6e 65 6c 20 63 68 61 6e 20 7c 20 2d 63 6f 6d 6d nel chan | -comm
8570: 61 6e 64 20 63 6d 64 4e 61 6d 65 20 7c 20 2d 66 and cmdName | -f
8580: 69 6c 65 20 66 69 6c 65 6e 61 6d 65 20 7c 20 3f ile filename | ?
8590: 2d 64 61 74 61 3f 20 64 61 74 61 5d 22 29 3b 0a -data? data]");.
85a0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
85b0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
85c0: 20 53 70 65 63 69 61 6c 20 63 61 73 65 20 6f 66 Special case of
85d0: 20 66 69 72 73 74 20 61 72 67 20 69 73 20 64 69 first arg is di
85e0: 67 65 73 74 2c 20 63 69 70 68 65 72 2c 20 6f 72 gest, cipher, or
85f0: 20 6d 61 63 20 2a 2f 0a 20 20 20 20 6f 70 74 20 mac */. opt
8600: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 = Tcl_GetString(
8610: 6f 62 6a 76 5b 73 74 61 72 74 5d 29 3b 0a 20 20 objv[start]);.
8620: 20 20 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 if (opt[0] !=
8630: 27 2d 27 29 20 7b 0a 09 73 77 69 74 63 68 28 74 '-') {..switch(t
8640: 79 70 65 29 20 7b 0a 09 63 61 73 65 20 54 59 50 ype) {..case TYP
8650: 45 5f 4d 44 3a 0a 09 63 61 73 65 20 54 59 50 45 E_MD:..case TYPE
8660: 5f 48 4d 41 43 3a 0a 09 20 20 20 20 64 69 67 65 _HMAC:.. dige
8670: 73 74 4f 62 6a 20 3d 20 6f 62 6a 76 5b 73 74 61 stObj = objv[sta
8680: 72 74 2b 2b 5d 3b 0a 09 20 20 20 20 62 72 65 61 rt++];.. brea
8690: 6b 3b 0a 09 63 61 73 65 20 54 59 50 45 5f 43 4d k;..case TYPE_CM
86a0: 41 43 3a 0a 09 20 20 20 20 63 69 70 68 65 72 4f AC:.. cipherO
86b0: 62 6a 20 3d 20 6f 62 6a 76 5b 73 74 61 72 74 2b bj = objv[start+
86c0: 2b 5d 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a +];.. break;.
86d0: 09 63 61 73 65 20 54 59 50 45 5f 4d 41 43 3a 0a .case TYPE_MAC:.
86e0: 09 20 20 20 20 6d 61 63 4f 62 6a 20 3d 20 6f 62 . macObj = ob
86f0: 6a 76 5b 73 74 61 72 74 2b 2b 5d 3b 0a 09 20 20 jv[start++];..
8700: 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20 break;..}.
8710: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6f 70 }.. /* Get op
8720: 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 66 6f 72 tions */. for
8730: 20 28 69 6e 74 20 69 64 78 20 3d 20 73 74 61 72 (int idx = star
8740: 74 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 t; idx < objc; i
8750: 64 78 2b 2b 29 20 7b 0a 09 2f 2a 20 53 70 65 63 dx++) {../* Spec
8760: 69 61 6c 20 63 61 73 65 20 66 6f 72 20 77 68 65 ial case for whe
8770: 6e 20 6c 61 73 74 20 61 72 67 20 69 73 20 64 61 n last arg is da
8780: 74 61 20 2a 2f 0a 09 69 66 20 28 69 64 78 20 3d ta */..if (idx =
8790: 3d 20 6f 62 6a 63 20 2d 20 31 29 20 7b 0a 09 20 = objc - 1) {..
87a0: 20 20 20 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 opt = Tcl_Get
87b0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69 64 78 5d String(objv[idx]
87c0: 29 3b 0a 09 20 20 20 20 69 66 20 28 6f 70 74 5b );.. if (opt[
87d0: 30 5d 20 21 3d 20 27 2d 27 20 26 26 20 64 61 74 0] != '-' && dat
87e0: 61 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a aObj == NULL) {.
87f0: 09 09 64 61 74 61 4f 62 6a 20 3d 20 6f 62 6a 76 ..dataObj = objv
8800: 5b 69 64 78 5d 3b 0a 09 09 62 72 65 61 6b 3b 0a [idx];...break;.
8810: 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 2f 2a 20 47 . }..}.../* G
8820: 65 74 20 6f 70 74 69 6f 6e 20 2a 2f 0a 09 69 66 et option */..if
8830: 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 (Tcl_GetIndexFr
8840: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 omObj(interp, ob
8850: 6a 76 5b 69 64 78 5d 2c 20 63 6f 6d 6d 61 6e 64 jv[idx], command
8860: 5f 6f 70 74 73 2c 20 22 6f 70 74 69 6f 6e 22 2c _opts, "option",
8870: 20 30 2c 20 26 66 6e 29 20 21 3d 20 54 43 4c 5f 0, &fn) != TCL_
8880: 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 OK) {.. retur
8890: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
88a0: 0a 09 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72 ../* Validate ar
88b0: 67 20 68 61 73 20 61 20 76 61 6c 75 65 20 2a 2f g has a value */
88c0: 0a 09 69 66 20 28 66 6e 20 3e 20 5f 6f 70 74 5f ..if (fn > _opt_
88d0: 68 65 78 61 64 65 63 69 6d 61 6c 29 20 7b 0a 09 hexadecimal) {..
88e0: 20 20 20 20 69 66 20 28 2b 2b 69 64 78 20 3e 3d if (++idx >=
88f0: 20 6f 62 6a 63 29 20 7b 0a 09 09 54 63 6c 5f 41 objc) {...Tcl_A
8900: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 ppendResult(inte
8910: 72 70 2c 20 22 4e 6f 20 76 61 6c 75 65 20 66 6f rp, "No value fo
8920: 72 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 63 6f r option \"", co
8930: 6d 6d 61 6e 64 5f 6f 70 74 73 5b 66 6e 5d 2c 20 mmand_opts[fn],
8940: 22 5c 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e "\"", (char *) N
8950: 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 ULL);...return T
8960: 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d CL_ERROR;.. }
8970: 0a 09 7d 0a 0a 09 73 77 69 74 63 68 28 66 6e 29 ..}...switch(fn)
8980: 20 7b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 62 69 {..case _opt_bi
8990: 6e 3a 0a 09 63 61 73 65 20 5f 6f 70 74 5f 62 69 n:..case _opt_bi
89a0: 6e 61 72 79 3a 0a 09 20 20 20 20 66 6f 72 6d 61 nary:.. forma
89b0: 74 20 3d 20 42 49 4e 5f 46 4f 52 4d 41 54 3b 0a t = BIN_FORMAT;.
89c0: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 . break;..cas
89d0: 65 20 5f 6f 70 74 5f 68 65 78 3a 0a 09 63 61 73 e _opt_hex:..cas
89e0: 65 20 5f 6f 70 74 5f 68 65 78 61 64 65 63 69 6d e _opt_hexadecim
89f0: 61 6c 3a 0a 09 20 20 20 20 66 6f 72 6d 61 74 20 al:.. format
8a00: 3d 20 48 45 58 5f 46 4f 52 4d 41 54 3b 0a 09 20 = HEX_FORMAT;..
8a10: 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 break;..case
8a20: 5f 6f 70 74 5f 63 68 61 6e 3a 0a 09 63 61 73 65 _opt_chan:..case
8a30: 20 5f 6f 70 74 5f 63 68 61 6e 6e 65 6c 3a 0a 20 _opt_channel:.
8a40: 20 20 20 09 20 20 20 20 47 45 54 5f 4f 50 54 5f . GET_OPT_
8a50: 53 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d STRING(objv[idx]
8a60: 2c 20 63 68 61 6e 6e 65 6c 2c 20 4e 55 4c 4c 29 , channel, NULL)
8a70: 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 ;.. break;..c
8a80: 61 73 65 20 5f 6f 70 74 5f 63 69 70 68 65 72 3a ase _opt_cipher:
8a90: 0a 09 20 20 20 20 63 69 70 68 65 72 4f 62 6a 20 .. cipherObj
8aa0: 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 09 20 20 = objv[idx];..
8ab0: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f break;..case _
8ac0: 6f 70 74 5f 63 6f 6d 6d 61 6e 64 3a 0a 09 20 20 opt_command:..
8ad0: 20 20 63 6d 64 4f 62 6a 20 3d 20 6f 62 6a 76 5b cmdObj = objv[
8ae0: 69 64 78 5d 3b 0a 09 20 20 20 20 62 72 65 61 6b idx];.. break
8af0: 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 64 61 74 ;..case _opt_dat
8b00: 61 3a 0a 09 20 20 20 20 64 61 74 61 4f 62 6a 20 a:.. dataObj
8b10: 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 09 20 20 = objv[idx];..
8b20: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f break;..case _
8b30: 6f 70 74 5f 64 69 67 65 73 74 3a 0a 09 63 61 73 opt_digest:..cas
8b40: 65 20 5f 6f 70 74 5f 68 61 73 68 3a 0a 09 20 20 e _opt_hash:..
8b50: 20 20 64 69 67 65 73 74 4f 62 6a 20 3d 20 6f 62 digestObj = ob
8b60: 6a 76 5b 69 64 78 5d 3b 0a 09 20 20 20 20 62 72 jv[idx];.. br
8b70: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f eak;..case _opt_
8b80: 66 69 6c 65 3a 0a 09 63 61 73 65 20 5f 6f 70 74 file:..case _opt
8b90: 5f 66 69 6c 65 6e 61 6d 65 3a 0a 09 20 20 20 20 _filename:..
8ba0: 66 69 6c 65 4f 62 6a 20 3d 20 6f 62 6a 76 5b 69 fileObj = objv[i
8bb0: 64 78 5d 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b dx];.. break;
8bc0: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 6b 65 79 3a ..case _opt_key:
8bd0: 0a 09 20 20 20 20 6b 65 79 4f 62 6a 20 3d 20 6f .. keyObj = o
8be0: 62 6a 76 5b 69 64 78 5d 3b 0a 09 20 20 20 20 62 bjv[idx];.. b
8bf0: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 reak;..case _opt
8c00: 5f 6c 65 6e 67 74 68 3a 0a 09 63 61 73 65 20 5f _length:..case _
8c10: 6f 70 74 5f 73 69 7a 65 3a 0a 20 20 20 20 09 20 opt_size:. .
8c20: 20 20 20 47 45 54 5f 4f 50 54 5f 49 4e 54 28 6f GET_OPT_INT(o
8c30: 62 6a 76 5b 69 64 78 5d 2c 20 26 6c 65 6e 67 74 bjv[idx], &lengt
8c40: 68 29 3b 0a 09 20 20 20 20 69 66 20 28 6c 65 6e h);.. if (len
8c50: 67 74 68 20 3c 20 31 20 7c 7c 20 6c 65 6e 67 74 gth < 1 || lengt
8c60: 68 20 3e 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 h > EVP_MAX_MD_S
8c70: 49 5a 45 29 20 7b 0a 09 09 54 63 6c 5f 41 70 70 IZE) {...Tcl_App
8c80: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
8c90: 2c 20 22 49 6e 76 61 6c 69 64 20 6c 65 6e 67 74 , "Invalid lengt
8ca0: 68 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c h", (char *) NUL
8cb0: 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c L);...return TCL
8cc0: 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 _ERROR;.. }..
8cd0: 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 break;..case
8ce0: 20 5f 6f 70 74 5f 6d 61 63 3a 0a 09 20 20 20 20 _opt_mac:..
8cf0: 6d 61 63 4f 62 6a 20 3d 20 6f 62 6a 76 5b 69 64 macObj = objv[id
8d00: 78 5d 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a x];.. break;.
8d10: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a .}. }.. /*
8d20: 20 43 68 65 63 6b 20 74 79 70 65 73 20 2a 2f 0a Check types */.
8d30: 20 20 20 20 69 66 20 28 74 79 70 65 20 3d 3d 20 if (type ==
8d40: 54 59 50 45 5f 4d 44 29 20 7b 0a 09 20 69 66 20 TYPE_MD) {.. if
8d50: 28 6d 61 63 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 (macObj != NULL)
8d60: 20 7b 0a 09 20 20 20 20 74 79 70 65 20 3d 20 54 {.. type = T
8d70: 59 50 45 5f 4d 41 43 3b 0a 09 7d 20 65 6c 73 65 YPE_MAC;..} else
8d80: 20 69 66 20 28 63 69 70 68 65 72 4f 62 6a 20 21 if (cipherObj !
8d90: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 74 = NULL) {.. t
8da0: 79 70 65 20 3d 20 54 59 50 45 5f 43 4d 41 43 3b ype = TYPE_CMAC;
8db0: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 6b 65 79 ..} else if (key
8dc0: 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 Obj != NULL) {..
8dd0: 20 20 20 20 74 79 70 65 20 3d 20 54 59 50 45 5f type = TYPE_
8de0: 48 4d 41 43 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a HMAC;..}. }..
8df0: 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 4d /* Convert M
8e00: 41 43 20 74 6f 20 43 4d 41 43 20 6f 72 20 48 4d AC to CMAC or HM
8e10: 41 43 20 74 79 70 65 20 2a 2f 0a 20 20 20 20 69 AC type */. i
8e20: 66 20 28 74 79 70 65 20 3d 3d 20 54 59 50 45 5f f (type == TYPE_
8e30: 4d 41 43 29 20 7b 0a 09 69 66 20 28 6d 61 63 4f MAC) {..if (macO
8e40: 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 bj != NULL) {..
8e50: 20 20 20 63 68 61 72 20 2a 6d 61 63 4e 61 6d 65 char *macName
8e60: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
8e70: 28 6d 61 63 4f 62 6a 29 3b 0a 09 20 20 20 20 69 (macObj);.. i
8e80: 66 20 28 73 74 72 63 6d 70 28 6d 61 63 4e 61 6d f (strcmp(macNam
8e90: 65 2c 22 63 6d 61 63 22 29 20 3d 3d 20 30 29 20 e,"cmac") == 0)
8ea0: 7b 0a 09 09 74 79 70 65 20 3d 20 54 59 50 45 5f {...type = TYPE_
8eb0: 43 4d 41 43 3b 0a 09 20 20 20 20 7d 20 65 6c 73 CMAC;.. } els
8ec0: 65 20 69 66 20 28 73 74 72 63 6d 70 28 6d 61 63 e if (strcmp(mac
8ed0: 4e 61 6d 65 2c 22 68 6d 61 63 22 29 20 3d 3d 20 Name,"hmac") ==
8ee0: 30 29 20 7b 0a 09 09 74 79 70 65 20 3d 20 54 59 0) {...type = TY
8ef0: 50 45 5f 48 4d 41 43 3b 0a 09 20 20 20 20 7d 20 PE_HMAC;.. }
8f00: 65 6c 73 65 20 7b 0a 09 09 54 63 6c 5f 41 70 70 else {...Tcl_App
8f10: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
8f20: 2c 20 22 69 6e 76 61 6c 69 64 20 4d 41 43 20 5c , "invalid MAC \
8f30: 22 22 2c 20 6d 61 63 4e 61 6d 65 2c 20 22 5c 22 "", macName, "\"
8f40: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
8f50: 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f );...return TCL_
8f60: 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 7d ERROR;.. }..}
8f70: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c else {.. Tcl
8f80: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
8f90: 74 65 72 70 2c 20 22 6e 6f 20 4d 41 43 22 2c 20 terp, "no MAC",
8fa0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
8fb0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
8fc0: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a ERROR;..}. }.
8fd0: 0a 20 20 20 20 2f 2a 20 43 61 6c 63 20 64 69 67 . /* Calc dig
8fe0: 65 73 74 20 6f 6e 20 66 69 6c 65 2c 20 73 74 61 est on file, sta
8ff0: 63 6b 65 64 20 63 68 61 6e 6e 65 6c 2c 20 75 73 cked channel, us
9000: 69 6e 67 20 69 6e 73 74 61 6e 63 65 20 63 6f 6d ing instance com
9010: 6d 61 6e 64 2c 20 6f 72 20 64 61 74 61 20 62 6c mand, or data bl
9020: 6f 62 20 2a 2f 0a 20 20 20 20 69 66 20 28 66 69 ob */. if (fi
9030: 6c 65 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b leObj != NULL) {
9040: 0a 09 72 65 73 20 3d 20 44 69 67 65 73 74 46 69 ..res = DigestFi
9050: 6c 65 48 61 6e 64 6c 65 72 28 69 6e 74 65 72 70 leHandler(interp
9060: 2c 20 66 69 6c 65 4f 62 6a 2c 20 64 69 67 65 73 , fileObj, diges
9070: 74 4f 62 6a 2c 20 63 69 70 68 65 72 4f 62 6a 2c tObj, cipherObj,
9080: 20 66 6f 72 6d 61 74 20 7c 20 74 79 70 65 2c 20 format | type,
9090: 6b 65 79 4f 62 6a 2c 0a 09 20 20 20 20 6d 61 63 keyObj,.. mac
90a0: 4f 62 6a 2c 20 6c 65 6e 67 74 68 29 3b 0a 20 20 Obj, length);.
90b0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 68 61 } else if (cha
90c0: 6e 6e 65 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a nnel != NULL) {.
90d0: 09 72 65 73 20 3d 20 44 69 67 65 73 74 43 68 61 .res = DigestCha
90e0: 6e 6e 65 6c 48 61 6e 64 6c 65 72 28 69 6e 74 65 nnelHandler(inte
90f0: 72 70 2c 20 63 68 61 6e 6e 65 6c 2c 20 64 69 67 rp, channel, dig
9100: 65 73 74 4f 62 6a 2c 20 63 69 70 68 65 72 4f 62 estObj, cipherOb
9110: 6a 2c 20 66 6f 72 6d 61 74 20 7c 20 74 79 70 65 j, format | type
9120: 2c 20 6b 65 79 4f 62 6a 2c 0a 09 20 20 20 20 6d , keyObj,.. m
9130: 61 63 4f 62 6a 2c 20 6c 65 6e 67 74 68 29 3b 0a acObj, length);.
9140: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 } else if (c
9150: 6d 64 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b mdObj != NULL) {
9160: 0a 09 72 65 73 20 3d 20 44 69 67 65 73 74 43 6f ..res = DigestCo
9170: 6d 6d 61 6e 64 48 61 6e 64 6c 65 72 28 69 6e 74 mmandHandler(int
9180: 65 72 70 2c 20 63 6d 64 4f 62 6a 2c 20 64 69 67 erp, cmdObj, dig
9190: 65 73 74 4f 62 6a 2c 20 63 69 70 68 65 72 4f 62 estObj, cipherOb
91a0: 6a 2c 20 66 6f 72 6d 61 74 20 7c 20 74 79 70 65 j, format | type
91b0: 2c 20 6b 65 79 4f 62 6a 2c 0a 09 20 20 20 20 6d , keyObj,.. m
91c0: 61 63 4f 62 6a 2c 20 6c 65 6e 67 74 68 29 3b 0a acObj, length);.
91d0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 64 } else if (d
91e0: 61 74 61 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 ataObj != NULL)
91f0: 7b 0a 09 72 65 73 20 3d 20 44 69 67 65 73 74 44 {..res = DigestD
9200: 61 74 61 48 61 6e 64 6c 65 72 28 69 6e 74 65 72 ataHandler(inter
9210: 70 2c 20 64 61 74 61 4f 62 6a 2c 20 64 69 67 65 p, dataObj, dige
9220: 73 74 4f 62 6a 2c 20 63 69 70 68 65 72 4f 62 6a stObj, cipherObj
9230: 2c 20 66 6f 72 6d 61 74 20 7c 20 74 79 70 65 2c , format | type,
9240: 20 6b 65 79 4f 62 6a 2c 0a 09 20 20 20 20 6d 61 keyObj,.. ma
9250: 63 4f 62 6a 2c 20 6c 65 6e 67 74 68 29 3b 0a 20 cObj, length);.
9260: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c } else {..Tcl
9270: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
9280: 74 65 72 70 2c 20 22 4e 6f 20 6f 70 65 72 61 74 terp, "No operat
9290: 69 6f 6e 3a 20 55 73 65 20 2d 63 68 61 6e 6e 65 ion: Use -channe
92a0: 6c 2c 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 61 l, -command, -da
92b0: 74 61 2c 20 6f 72 20 2d 66 69 6c 65 20 6f 70 74 ta, or -file opt
92c0: 69 6f 6e 22 2c 0a 09 20 20 20 20 28 63 68 61 72 ion",.. (char
92d0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 73 20 *) NULL);..res
92e0: 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 = TCL_ERROR;.
92f0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 }. return re
9300: 73 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d s;.}../*. *-----
9310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
9350: 2a 0a 20 2a 20 4d 65 73 73 61 67 65 20 44 69 67 *. * Message Dig
9360: 65 73 74 20 61 6e 64 20 4d 65 73 73 61 67 65 20 est and Message
9370: 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 43 Authentication C
9380: 6f 64 65 20 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a ode Commands --.
9390: 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 4d 65 73 *. *.Return Mes
93a0: 73 61 67 65 20 44 69 67 65 73 74 20 28 4d 44 29 sage Digest (MD)
93b0: 20 6f 72 20 4d 65 73 73 61 67 65 20 41 75 74 68 or Message Auth
93c0: 65 6e 74 69 63 61 74 69 6f 6e 20 43 6f 64 65 20 entication Code
93d0: 28 4d 41 43 29 2e 0a 20 2a 0a 20 2a 20 52 65 74 (MAC).. *. * Ret
93e0: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 urns:. *.TCL_OK
93f0: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a or TCL_ERROR. *.
9400: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
9410: 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20 . *.Sets result
9420: 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 to message diges
9430: 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 t or error messa
9440: 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ge. *. *--------
9450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
9490: 73 74 61 74 69 63 20 69 6e 74 20 4d 64 4f 62 6a static int MdObj
94a0: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
94b0: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
94c0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
94d0: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
94e0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
94f0: 7b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 {. (void) cli
9500: 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 72 65 74 entData;. ret
9510: 75 72 6e 20 44 69 67 65 73 74 4d 61 69 6e 28 54 urn DigestMain(T
9520: 59 50 45 5f 4d 44 2c 20 69 6e 74 65 72 70 2c 20 YPE_MD, interp,
9530: 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 0a objc, objv);.}..
9540: 73 74 61 74 69 63 20 69 6e 74 20 43 4d 41 43 4f static int CMACO
9550: 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 bjCmd(ClientData
9560: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
9570: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
9580: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
9590: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
95a0: 29 20 7b 0a 20 20 20 20 28 76 6f 69 64 29 20 63 ) {. (void) c
95b0: 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 72 lientData;. r
95c0: 65 74 75 72 6e 20 44 69 67 65 73 74 4d 61 69 6e eturn DigestMain
95d0: 28 54 59 50 45 5f 43 4d 41 43 2c 20 69 6e 74 65 (TYPE_CMAC, inte
95e0: 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b rp, objc, objv);
95f0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 48 .}..static int H
9600: 4d 41 43 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 MACObjCmd(Client
9610: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
9620: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
9630: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
9640: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
9650: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 28 76 6f 69 jv[]) {. (voi
9660: 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 d) clientData;.
9670: 20 20 20 72 65 74 75 72 6e 20 44 69 67 65 73 74 return Digest
9680: 4d 61 69 6e 28 54 59 50 45 5f 48 4d 41 43 2c 20 Main(TYPE_HMAC,
9690: 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 interp, objc, ob
96a0: 6a 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 jv);.}..static i
96b0: 6e 74 20 4d 41 43 4f 62 6a 43 6d 64 28 43 6c 69 nt MACObjCmd(Cli
96c0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
96d0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
96e0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
96f0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
9700: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 28 objv[]) {. (
9710: 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 void) clientData
9720: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69 67 ;. return Dig
9730: 65 73 74 4d 61 69 6e 28 54 59 50 45 5f 4d 41 43 estMain(TYPE_MAC
9740: 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 , interp, objc,
9750: 6f 62 6a 76 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d objv);.}../*. *-
9760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
97a0: 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65 --. *. * Message
97b0: 20 44 69 67 65 73 74 20 43 6f 6e 76 65 6e 69 65 Digest Convenie
97c0: 6e 63 65 20 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a nce Commands --.
97d0: 20 2a 0a 20 2a 09 43 6f 6e 76 65 6e 69 65 6e 63 *. *.Convenienc
97e0: 65 20 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 73 e commands for s
97f0: 65 6c 65 63 74 20 6d 65 73 73 61 67 65 20 64 69 elect message di
9800: 67 65 73 74 73 2e 0a 20 2a 0a 20 2a 20 52 65 74 gests.. *. * Ret
9810: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 urns:. *.TCL_OK
9820: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a or TCL_ERROR. *.
9830: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
9840: 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20 . *.Sets result
9850: 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 to message diges
9860: 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 t or error messa
9870: 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ge. *. *--------
9880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
98a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
98b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
98c0: 20 69 6e 74 20 54 65 6d 70 6c 61 74 65 43 6d 64 int TemplateCmd
98d0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 (Tcl_Interp *int
98e0: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
98f0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
9900: 6a 76 5b 5d 2c 20 63 68 61 72 20 2a 64 69 67 65 jv[], char *dige
9910: 73 74 4e 61 6d 65 2c 20 69 6e 74 20 66 6f 72 6d stName, int form
9920: 61 74 29 20 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 at) {. Tcl_Ob
9930: 6a 20 2a 64 61 74 61 4f 62 6a 2c 20 2a 64 69 67 j *dataObj, *dig
9940: 65 73 74 4f 62 6a 3b 0a 20 20 20 20 69 6e 74 20 estObj;. int
9950: 72 65 73 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 res;.. if (ob
9960: 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 64 61 74 61 jc == 2) {..data
9970: 4f 62 6a 20 3d 20 6f 62 6a 76 5b 31 5d 3b 0a 20 Obj = objv[1];.
9980: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c } else {..Tcl
9990: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
99a0: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
99b0: 64 61 74 61 22 29 3b 0a 09 72 65 74 75 72 6e 20 data");..return
99c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
99d0: 0a 0a 20 20 20 20 64 69 67 65 73 74 4f 62 6a 20 .. digestObj
99e0: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f = Tcl_NewStringO
99f0: 62 6a 28 64 69 67 65 73 74 4e 61 6d 65 2c 20 2d bj(digestName, -
9a00: 31 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 1);. Tcl_Incr
9a10: 52 65 66 43 6f 75 6e 74 28 64 69 67 65 73 74 4f RefCount(digestO
9a20: 62 6a 29 3b 0a 20 20 20 20 72 65 73 20 3d 20 44 bj);. res = D
9a30: 69 67 65 73 74 44 61 74 61 48 61 6e 64 6c 65 72 igestDataHandler
9a40: 28 69 6e 74 65 72 70 2c 20 64 61 74 61 4f 62 6a (interp, dataObj
9a50: 2c 20 64 69 67 65 73 74 4f 62 6a 2c 20 4e 55 4c , digestObj, NUL
9a60: 4c 2c 20 66 6f 72 6d 61 74 2c 20 4e 55 4c 4c 2c L, format, NULL,
9a70: 20 4e 55 4c 4c 2c 20 45 56 50 5f 4d 41 58 5f 4d NULL, EVP_MAX_M
9a80: 44 5f 53 49 5a 45 29 3b 0a 20 20 20 20 54 63 6c D_SIZE);. Tcl
9a90: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 64 69 _DecrRefCount(di
9aa0: 67 65 73 74 4f 62 6a 29 3b 0a 20 20 20 20 72 65 gestObj);. re
9ab0: 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 20 0a 69 6e turn res;.}. .in
9ac0: 74 20 4d 44 34 4f 62 6a 43 6d 64 28 43 6c 69 65 t MD4ObjCmd(Clie
9ad0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
9ae0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
9af0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
9b00: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
9b10: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 28 76 objv[]) {. (v
9b20: 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b oid) clientData;
9b30: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 65 6d 70 . return Temp
9b40: 6c 61 74 65 43 6d 64 28 69 6e 74 65 72 70 2c 20 lateCmd(interp,
9b50: 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 22 6d 64 34 objc, objv, "md4
9b60: 22 2c 20 48 45 58 5f 46 4f 52 4d 41 54 20 7c 20 ", HEX_FORMAT |
9b70: 54 59 50 45 5f 4d 44 29 3b 0a 7d 0a 0a 69 6e 74 TYPE_MD);.}..int
9b80: 20 4d 44 35 4f 62 6a 43 6d 64 28 43 6c 69 65 6e MD5ObjCmd(Clien
9b90: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
9ba0: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
9bb0: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
9bc0: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
9bd0: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 28 76 6f bjv[]) {. (vo
9be0: 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a id) clientData;.
9bf0: 20 20 20 20 72 65 74 75 72 6e 20 54 65 6d 70 6c return Templ
9c00: 61 74 65 43 6d 64 28 69 6e 74 65 72 70 2c 20 6f ateCmd(interp, o
9c10: 62 6a 63 2c 20 6f 62 6a 76 2c 20 22 6d 64 35 22 bjc, objv, "md5"
9c20: 2c 20 48 45 58 5f 46 4f 52 4d 41 54 20 7c 20 54 , HEX_FORMAT | T
9c30: 59 50 45 5f 4d 44 29 3b 0a 7d 0a 0a 69 6e 74 20 YPE_MD);.}..int
9c40: 53 48 41 31 4f 62 6a 43 6d 64 28 43 6c 69 65 6e SHA1ObjCmd(Clien
9c50: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
9c60: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
9c70: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
9c80: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
9c90: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 28 76 6f bjv[]) {. (vo
9ca0: 69 64 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a id) clientData;.
9cb0: 20 20 20 20 72 65 74 75 72 6e 20 54 65 6d 70 6c return Templ
9cc0: 61 74 65 43 6d 64 28 69 6e 74 65 72 70 2c 20 6f ateCmd(interp, o
9cd0: 62 6a 63 2c 20 6f 62 6a 76 2c 20 22 73 68 61 31 bjc, objv, "sha1
9ce0: 22 2c 20 48 45 58 5f 46 4f 52 4d 41 54 20 7c 20 ", HEX_FORMAT |
9cf0: 54 59 50 45 5f 4d 44 29 3b 0a 7d 0a 0a 69 6e 74 TYPE_MD);.}..int
9d00: 20 53 48 41 32 35 36 4f 62 6a 43 6d 64 28 43 6c SHA256ObjCmd(Cl
9d10: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
9d20: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
9d30: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
9d40: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
9d50: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
9d60: 28 76 6f 69 64 29 20 63 6c 69 65 6e 74 44 61 74 (void) clientDat
9d70: 61 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 65 a;. return Te
9d80: 6d 70 6c 61 74 65 43 6d 64 28 69 6e 74 65 72 70 mplateCmd(interp
9d90: 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 22 73 , objc, objv, "s
9da0: 68 61 32 35 36 22 2c 20 48 45 58 5f 46 4f 52 4d ha256", HEX_FORM
9db0: 41 54 20 7c 20 54 59 50 45 5f 4d 44 29 3b 0a 7d AT | TYPE_MD);.}
9dc0: 0a 0a 69 6e 74 20 53 48 41 35 31 32 4f 62 6a 43 ..int SHA512ObjC
9dd0: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
9de0: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
9df0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
9e00: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
9e10: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
9e20: 0a 20 20 20 20 28 76 6f 69 64 29 20 63 6c 69 65 . (void) clie
9e30: 6e 74 44 61 74 61 3b 0a 20 20 20 20 72 65 74 75 ntData;. retu
9e40: 72 6e 20 54 65 6d 70 6c 61 74 65 43 6d 64 28 69 rn TemplateCmd(i
9e50: 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a nterp, objc, obj
9e60: 76 2c 20 22 73 68 61 35 31 32 22 2c 20 48 45 58 v, "sha512", HEX
9e70: 5f 46 4f 52 4d 41 54 20 7c 20 54 59 50 45 5f 4d _FORMAT | TYPE_M
9e80: 44 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d D);.}../*. *----
9e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
9ed0: 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73 74 *. * Tls_Digest
9ee0: 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a 20 Commands --. *.
9ef0: 2a 09 43 72 65 61 74 65 20 64 69 67 65 73 74 20 *.Create digest
9f00: 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 20 52 commands. *. * R
9f10: 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f eturns:. *.TCL_O
9f20: 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 K or TCL_ERROR.
9f30: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
9f40: 73 3a 0a 20 2a 09 43 72 65 61 74 65 73 20 63 6f s:. *.Creates co
9f50: 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d mmands. *. *----
9f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
9fa0: 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f 44 69 67 65 */.int Tls_Dige
9fb0: 73 74 43 6f 6d 6d 61 6e 64 73 28 54 63 6c 5f 49 stCommands(Tcl_I
9fc0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 29 20 7b nterp *interp) {
9fd0: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
9fe0: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
9ff0: 2c 20 22 3a 3a 74 6c 73 3a 3a 64 69 67 65 73 74 , "::tls::digest
a000: 22 2c 20 4d 64 4f 62 6a 43 6d 64 2c 20 28 43 6c ", MdObjCmd, (Cl
a010: 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 ientData) NULL,
a020: 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
a030: 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
a040: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
a050: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a mmand(interp, ":
a060: 3a 74 6c 73 3a 3a 68 61 73 68 22 2c 20 4d 64 4f :tls::hash", MdO
a070: 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
a080: 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 ta) NULL, (Tcl_C
a090: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
a0a0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
a0b0: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
a0c0: 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a interp, "::tls::
a0d0: 6d 64 22 2c 20 4d 64 4f 62 6a 43 6d 64 2c 20 28 md", MdObjCmd, (
a0e0: 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 4c 4c ClientData) NULL
a0f0: 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 , (Tcl_CmdDelete
a100: 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 Proc *) NULL);.
a110: 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a Tcl_CreateObj
a120: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
a130: 22 3a 3a 74 6c 73 3a 3a 63 6d 61 63 22 2c 20 43 "::tls::cmac", C
a140: 4d 41 43 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 MACObjCmd, (Clie
a150: 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 ntData) NULL, (T
a160: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
a170: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
a180: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
a190: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 and(interp, "::t
a1a0: 6c 73 3a 3a 68 6d 61 63 22 2c 20 48 4d 41 43 4f ls::hmac", HMACO
a1b0: 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
a1c0: 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 ta) NULL, (Tcl_C
a1d0: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
a1e0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
a1f0: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
a200: 69 6e 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a interp, "::tls::
a210: 6d 61 63 22 2c 20 4d 41 43 4f 62 6a 43 6d 64 2c mac", MACObjCmd,
a220: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 (ClientData) NU
a230: 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
a240: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
a250: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
a260: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
a270: 2c 20 22 3a 3a 74 6c 73 3a 3a 6d 64 34 22 2c 20 , "::tls::md4",
a280: 4d 44 34 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 MD4ObjCmd, (Clie
a290: 6e 74 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 ntData) NULL, (T
a2a0: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
a2b0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
a2c0: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
a2d0: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 3a 3a 74 and(interp, "::t
a2e0: 6c 73 3a 3a 6d 64 35 22 2c 20 4d 44 35 4f 62 6a ls::md5", MD5Obj
a2f0: 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
a300: 29 20 4e 55 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 ) NULL, (Tcl_Cmd
a310: 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 DeleteProc *) NU
a320: 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 LL);. Tcl_Cre
a330: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
a340: 74 65 72 70 2c 20 22 3a 3a 74 6c 73 3a 3a 73 68 terp, "::tls::sh
a350: 61 31 22 2c 20 53 48 41 31 4f 62 6a 43 6d 64 2c a1", SHA1ObjCmd,
a360: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 (ClientData) NU
a370: 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
a380: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
a390: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
a3a0: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
a3b0: 2c 20 22 3a 3a 74 6c 73 3a 3a 73 68 61 32 35 36 , "::tls::sha256
a3c0: 22 2c 20 53 48 41 32 35 36 4f 62 6a 43 6d 64 2c ", SHA256ObjCmd,
a3d0: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 (ClientData) NU
a3e0: 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
a3f0: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
a400: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
a410: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
a420: 2c 20 22 3a 3a 74 6c 73 3a 3a 73 68 61 35 31 32 , "::tls::sha512
a430: 22 2c 20 53 48 41 35 31 32 4f 62 6a 43 6d 64 2c ", SHA512ObjCmd,
a440: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 4e 55 (ClientData) NU
a450: 4c 4c 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 LL, (Tcl_CmdDele
a460: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
a470: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
a480: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
a490: 2c 20 22 3a 3a 74 6c 73 3a 3a 75 6e 73 74 61 63 , "::tls::unstac
a4a0: 6b 22 2c 20 44 69 67 65 73 74 55 6e 73 74 61 63 k", DigestUnstac
a4b0: 6b 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 kObjCmd, (Client
a4c0: 44 61 74 61 29 20 4e 55 4c 4c 2c 20 28 54 63 6c Data) NULL, (Tcl
a4d0: 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a _CmdDeleteProc *
a4e0: 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 72 65 74 ) NULL);. ret
a4f0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a urn TCL_OK;.}..