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 61 6e 64 20 6f 70 65 72 61 74 ormat and operat
0230: 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42 ion */.#define B
0240: 49 4e 5f 46 4f 52 4d 41 54 09 30 78 30 31 0a 23 IN_FORMAT.0x01.#
0250: 64 65 66 69 6e 65 20 48 45 58 5f 46 4f 52 4d 41 define HEX_FORMA
0260: 54 09 30 78 30 32 0a 23 64 65 66 69 6e 65 20 49 T.0x02.#define I
0270: 53 5f 58 4f 46 09 09 30 78 30 38 0a 23 64 65 66 S_XOF..0x08.#def
0280: 69 6e 65 20 54 59 50 45 5f 4d 44 09 09 30 78 31 ine TYPE_MD..0x1
0290: 30 0a 23 64 65 66 69 6e 65 20 54 59 50 45 5f 48 0.#define TYPE_H
02a0: 4d 41 43 09 30 78 32 30 0a 23 64 65 66 69 6e 65 MAC.0x20.#define
02b0: 20 54 59 50 45 5f 43 4d 41 43 09 30 78 34 30 0a TYPE_CMAC.0x40.
02c0: 23 64 65 66 69 6e 65 20 54 59 50 45 5f 4d 41 43 #define TYPE_MAC
02d0: 09 30 78 38 30 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a .0x80../********
02e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
02f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0300: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0310: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a ***********/../*
0320: 0a 20 2a 20 54 68 69 73 20 73 74 72 75 63 74 75 . * This structu
0330: 72 65 20 64 65 66 69 6e 65 73 20 74 68 65 20 70 re defines the p
0340: 65 72 2d 69 6e 73 74 61 6e 63 65 20 73 74 61 74 er-instance stat
0350: 65 20 6f 66 20 61 20 64 69 67 65 73 74 20 6f 70 e of a digest op
0360: 65 72 61 74 69 6f 6e 2e 0a 20 2a 2f 0a 74 79 70 eration.. */.typ
0370: 65 64 65 66 20 73 74 72 75 63 74 20 44 69 67 65 edef struct Dige
0380: 73 74 53 74 61 74 65 20 7b 0a 09 54 63 6c 5f 43 stState {..Tcl_C
0390: 68 61 6e 6e 65 6c 20 73 65 6c 66 3b 09 2f 2a 20 hannel self;./*
03a0: 54 68 69 73 20 73 6f 63 6b 65 74 20 63 68 61 6e This socket chan
03b0: 6e 65 6c 20 2a 2f 0a 09 54 63 6c 5f 54 69 6d 65 nel */..Tcl_Time
03c0: 72 54 6f 6b 65 6e 20 74 69 6d 65 72 3b 09 2f 2a rToken timer;./*
03d0: 20 54 69 6d 65 72 20 66 6f 72 20 72 65 61 64 20 Timer for read
03e0: 65 76 65 6e 74 73 20 2a 2f 0a 0a 09 69 6e 74 20 events */...int
03f0: 66 6c 61 67 73 3b 09 09 2f 2a 20 43 68 61 6e 20 flags;../* Chan
0400: 63 6f 6e 66 69 67 20 66 6c 61 67 73 20 2a 2f 0a config flags */.
0410: 09 69 6e 74 20 77 61 74 63 68 4d 61 73 6b 3b 09 .int watchMask;.
0420: 09 2f 2a 20 43 75 72 72 65 6e 74 20 57 61 74 63 ./* Current Watc
0430: 68 50 72 6f 63 20 6d 61 73 6b 20 2a 2f 0a 09 69 hProc mask */..i
0440: 6e 74 20 6d 6f 64 65 3b 09 09 2f 2a 20 43 75 72 nt mode;../* Cur
0450: 72 65 6e 74 20 6d 6f 64 65 20 6f 66 20 70 61 72 rent mode of par
0460: 65 6e 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 09 ent channel */..
0470: 69 6e 74 20 66 6f 72 6d 61 74 3b 09 09 2f 2a 20 int format;../*
0480: 44 69 67 65 73 74 20 66 6f 72 6d 61 74 20 61 6e Digest format an
0490: 64 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a d operation */..
04a0: 09 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 .Tcl_Interp *int
04b0: 65 72 70 3b 09 2f 2a 20 43 75 72 72 65 6e 74 20 erp;./* Current
04c0: 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 09 interpreter */..
04d0: 45 56 50 5f 4d 44 5f 43 54 58 20 2a 63 74 78 3b EVP_MD_CTX *ctx;
04e0: 09 2f 2a 20 4d 44 20 43 6f 6e 74 65 78 74 20 2a ./* MD Context *
04f0: 2f 0a 09 48 4d 41 43 5f 43 54 58 20 2a 68 63 74 /..HMAC_CTX *hct
0500: 78 3b 09 09 2f 2a 20 48 4d 41 43 20 63 6f 6e 74 x;../* HMAC cont
0510: 65 78 74 20 2a 2f 0a 09 43 4d 41 43 5f 43 54 58 ext */..CMAC_CTX
0520: 20 2a 63 63 74 78 3b 09 09 2f 2a 20 43 4d 41 43 *cctx;../* CMAC
0530: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 09 54 63 6c context */..Tcl
0540: 5f 43 6f 6d 6d 61 6e 64 20 74 6f 6b 65 6e 3b 09 _Command token;.
0550: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74 6f 6b 65 6e /* Command token
0560: 20 2a 2f 0a 7d 20 44 69 67 65 73 74 53 74 61 74 */.} DigestStat
0570: 65 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d e;../*. *-------
0580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
05c0: 20 2a 20 44 69 67 65 73 74 53 74 61 74 65 4e 65 * DigestStateNe
05d0: 77 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 w --. *. *.This
05e0: 66 75 6e 63 74 69 6f 6e 20 63 72 65 61 74 65 73 function creates
05f0: 20 61 20 70 65 72 2d 69 6e 73 74 61 6e 63 65 20 a per-instance
0600: 73 74 61 74 65 20 64 61 74 61 20 73 74 72 75 63 state data struc
0610: 74 75 72 65 0a 20 2a 0a 20 2a 20 52 65 74 75 72 ture. *. * Retur
0620: 6e 73 3a 0a 20 2a 09 44 69 67 65 73 74 20 73 74 ns:. *.Digest st
0630: 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 72 0a ructure pointer.
0640: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
0650: 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 73 20 73 ts:. *.Creates s
0660: 74 72 75 63 74 75 72 65 0a 20 2a 0a 20 2a 2d 2d tructure. *. *--
0670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
06a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
06b0: 2d 0a 20 2a 2f 0a 44 69 67 65 73 74 53 74 61 74 -. */.DigestStat
06c0: 65 20 2a 44 69 67 65 73 74 53 74 61 74 65 4e 65 e *DigestStateNe
06d0: 77 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e w(Tcl_Interp *in
06e0: 74 65 72 70 2c 20 69 6e 74 20 66 6f 72 6d 61 74 terp, int format
06f0: 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 ) {. DigestSt
0700: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 0a ate *statePtr;..
0710: 20 20 20 20 73 74 61 74 65 50 74 72 20 3d 20 28 statePtr = (
0720: 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 DigestState *) c
0730: 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64 kalloc((unsigned
0740: 29 20 73 69 7a 65 6f 66 28 44 69 67 65 73 74 53 ) sizeof(DigestS
0750: 74 61 74 65 29 29 3b 0a 20 20 20 20 69 66 20 28 tate));. if (
0760: 73 74 61 74 65 50 74 72 20 21 3d 20 4e 55 4c 4c statePtr != NULL
0770: 29 20 7b 0a 09 6d 65 6d 73 65 74 28 73 74 61 74 ) {..memset(stat
0780: 65 50 74 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 ePtr, 0, sizeof(
0790: 44 69 67 65 73 74 53 74 61 74 65 29 29 3b 0a 09 DigestState));..
07a0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 09 3d statePtr->self.=
07b0: 20 4e 55 4c 4c 3b 09 09 2f 2a 20 54 68 69 73 20 NULL;../* This
07c0: 73 6f 63 6b 65 74 20 63 68 61 6e 6e 65 6c 20 2a socket channel *
07d0: 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d /..statePtr->tim
07e0: 65 72 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 54 er = NULL;../* T
07f0: 69 6d 65 72 20 74 6f 20 66 6c 75 73 68 20 64 61 imer to flush da
0800: 74 61 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d ta */..statePtr-
0810: 3e 66 6c 61 67 73 20 3d 20 30 3b 09 09 2f 2a 20 >flags = 0;../*
0820: 43 68 61 6e 20 63 6f 6e 66 69 67 20 66 6c 61 67 Chan config flag
0830: 73 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e s */..statePtr->
0840: 77 61 74 63 68 4d 61 73 6b 20 3d 20 30 3b 09 2f watchMask = 0;./
0850: 2a 20 43 75 72 72 65 6e 74 20 57 61 74 63 68 50 * Current WatchP
0860: 72 6f 63 20 6d 61 73 6b 20 2a 2f 0a 09 73 74 61 roc mask */..sta
0870: 74 65 50 74 72 2d 3e 6d 6f 64 65 09 3d 20 30 3b tePtr->mode.= 0;
0880: 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 6d 6f 64 ../* Current mod
0890: 65 20 6f 66 20 70 61 72 65 6e 74 20 63 68 61 6e e of parent chan
08a0: 6e 65 6c 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 nel */..statePtr
08b0: 2d 3e 66 6f 72 6d 61 74 20 3d 20 66 6f 72 6d 61 ->format = forma
08c0: 74 3b 09 2f 2a 20 44 69 67 65 73 74 20 66 6f 72 t;./* Digest for
08d0: 6d 61 74 20 61 6e 64 20 6f 70 65 72 61 74 69 6f mat and operatio
08e0: 6e 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e n */..statePtr->
08f0: 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b interp = interp;
0900: 09 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 ./* Current inte
0910: 72 70 72 65 74 65 72 20 2a 2f 0a 09 73 74 61 74 rpreter */..stat
0920: 65 50 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c ePtr->ctx = NULL
0930: 3b 09 09 2f 2a 20 4d 44 20 43 6f 6e 74 65 78 74 ;../* MD Context
0940: 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 68 */..statePtr->h
0950: 63 74 78 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 ctx = NULL;../*
0960: 48 4d 41 43 20 43 6f 6e 74 65 78 74 20 2a 2f 0a HMAC Context */.
0970: 09 73 74 61 74 65 50 74 72 2d 3e 63 63 74 78 20 .statePtr->cctx
0980: 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 43 4d 41 43 = NULL;../* CMAC
0990: 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 74 61 Context */..sta
09a0: 74 65 50 74 72 2d 3e 74 6f 6b 65 6e 20 3d 20 4e tePtr->token = N
09b0: 55 4c 4c 3b 09 09 2f 2a 20 43 6f 6d 6d 61 6e 64 ULL;../* Command
09c0: 20 74 6f 6b 65 6e 20 2a 2f 0a 20 20 20 20 7d 0a token */. }.
09d0: 20 20 20 20 72 65 74 75 72 6e 20 73 74 61 74 65 return state
09e0: 50 74 72 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d Ptr;.}../*. *---
09f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a30: 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 53 74 61 . *. * DigestSta
0a40: 74 65 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09 teFree --. *. *.
0a50: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 This function de
0a60: 6c 65 74 65 73 20 61 20 64 69 67 65 73 74 20 73 letes a digest s
0a70: 74 61 74 65 20 73 74 72 75 63 74 75 72 65 0a 20 tate structure.
0a80: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a *. * Returns:. *
0a90: 09 4e 6f 74 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 .Nothing. *. * S
0aa0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
0ab0: 52 65 6d 6f 76 65 73 20 73 74 72 75 63 74 75 72 Removes structur
0ac0: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d e. *. *---------
0ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 ----------. */.v
0b10: 6f 69 64 20 44 69 67 65 73 74 53 74 61 74 65 46 oid DigestStateF
0b20: 72 65 65 28 44 69 67 65 73 74 53 74 61 74 65 20 ree(DigestState
0b30: 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20 *statePtr) {.
0b40: 20 69 66 20 28 73 74 61 74 65 50 74 72 20 3d 3d if (statePtr ==
0b50: 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 (DigestState *)
0b60: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
0b70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
0b80: 52 65 6d 6f 76 65 20 70 65 6e 64 69 6e 67 20 74 Remove pending t
0b90: 69 6d 65 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 imer */. if (
0ba0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 statePtr->timer
0bb0: 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b != (Tcl_TimerTok
0bc0: 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c en) NULL) {..Tcl
0bd0: 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 _DeleteTimerHand
0be0: 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 ler(statePtr->ti
0bf0: 6d 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 mer);. }..
0c00: 20 2f 2a 20 46 72 65 65 20 63 6f 6e 74 65 78 74 /* Free context
0c10: 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 structures */.
0c20: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d if (statePtr-
0c30: 3e 63 74 78 20 21 3d 20 28 45 56 50 5f 4d 44 5f >ctx != (EVP_MD_
0c40: 43 54 58 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 CTX *) NULL) {..
0c50: 45 56 50 5f 4d 44 5f 43 54 58 5f 66 72 65 65 28 EVP_MD_CTX_free(
0c60: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a statePtr->ctx);.
0c70: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 }. if (st
0c80: 61 74 65 50 74 72 2d 3e 68 63 74 78 20 21 3d 20 atePtr->hctx !=
0c90: 28 48 4d 41 43 5f 43 54 58 20 2a 29 20 4e 55 4c (HMAC_CTX *) NUL
0ca0: 4c 29 20 7b 0a 09 48 4d 41 43 5f 43 54 58 5f 66 L) {..HMAC_CTX_f
0cb0: 72 65 65 28 73 74 61 74 65 50 74 72 2d 3e 68 63 ree(statePtr->hc
0cc0: 74 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 tx);. }. i
0cd0: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 63 74 f (statePtr->cct
0ce0: 78 20 21 3d 20 28 43 4d 41 43 5f 43 54 58 20 2a x != (CMAC_CTX *
0cf0: 29 20 4e 55 4c 4c 29 20 7b 0a 09 43 4d 41 43 5f ) NULL) {..CMAC_
0d00: 43 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 CTX_free(statePt
0d10: 72 2d 3e 63 63 74 78 29 3b 0a 20 20 20 20 7d 0a r->cctx);. }.
0d20: 20 20 20 20 63 6b 66 72 65 65 28 73 74 61 74 65 ckfree(state
0d30: 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a Ptr);.}../******
0d40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0d50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0d60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0d70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a *************/..
0d80: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
0d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0dc0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 --------. *. * D
0dd0: 69 67 65 73 74 49 6e 69 74 69 61 6c 69 7a 65 20 igestInitialize
0de0: 2d 2d 0a 20 2a 0a 20 2a 09 49 6e 69 74 69 61 6c --. *. *.Initial
0df0: 69 7a 65 20 61 20 68 61 73 68 20 66 75 6e 63 74 ize a hash funct
0e00: 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e ion. *. * Return
0e10: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 s:. *.TCL_OK if
0e20: 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 54 43 successful or TC
0e30: 4c 5f 45 52 52 4f 52 20 66 6f 72 20 66 61 69 6c L_ERROR for fail
0e40: 75 72 65 20 77 69 74 68 20 72 65 73 75 6c 74 20 ure with result
0e50: 73 65 74 0a 20 2a 09 74 6f 20 65 72 72 6f 72 20 set. *.to error
0e60: 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 20 53 message.. *. * S
0e70: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
0e80: 4e 6f 20 72 65 73 75 6c 74 20 6f 72 20 65 72 72 No result or err
0e90: 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a or message. *. *
0ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ee0: 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 ---. */.int Dige
0ef0: 73 74 49 6e 69 74 69 61 6c 69 7a 65 28 54 63 6c stInitialize(Tcl
0f00: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
0f10: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 DigestState *st
0f20: 61 74 65 50 74 72 2c 20 54 63 6c 5f 4f 62 6a 20 atePtr, Tcl_Obj
0f30: 2a 64 69 67 65 73 74 4f 62 6a 2c 0a 09 54 63 6c *digestObj,..Tcl
0f40: 5f 4f 62 6a 20 2a 63 69 70 68 65 72 4f 62 6a 2c _Obj *cipherObj,
0f50: 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a Tcl_Obj *keyObj
0f60: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6d 61 63 4f 62 , Tcl_Obj *macOb
0f70: 6a 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 j) {. int res
0f80: 20 3d 20 30 2c 20 74 79 70 65 20 3d 20 73 74 61 = 0, type = sta
0f90: 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 tePtr->format &
0fa0: 30 78 46 46 30 3b 0a 20 20 20 20 63 6f 6e 73 74 0xFF0;. const
0fb0: 20 45 56 50 5f 4d 44 20 2a 6d 64 20 3d 20 4e 55 EVP_MD *md = NU
0fc0: 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 LL;. const EV
0fd0: 50 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 P_CIPHER *cipher
0fe0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e = NULL;. con
0ff0: 73 74 20 76 6f 69 64 20 2a 6b 65 79 20 3d 20 4e st void *key = N
1000: 55 4c 4c 2c 20 2a 69 76 20 3d 20 4e 55 4c 4c 2c ULL, *iv = NULL,
1010: 20 2a 73 61 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20 *salt = NULL;.
1020: 20 20 20 69 6e 74 20 6b 65 79 5f 6c 65 6e 20 3d int key_len =
1030: 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 0;.. dprintf
1040: 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 ("Called");..
1050: 20 2f 2a 20 47 65 74 20 64 69 67 65 73 74 20 2a /* Get digest *
1060: 2f 0a 20 20 20 20 6d 64 20 3d 20 55 74 69 6c 5f /. md = Util_
1070: 47 65 74 44 69 67 65 73 74 28 69 6e 74 65 72 70 GetDigest(interp
1080: 2c 20 64 69 67 65 73 74 4f 62 6a 2c 20 74 79 70 , digestObj, typ
1090: 65 20 21 3d 20 54 59 50 45 5f 43 4d 41 43 29 3b e != TYPE_CMAC);
10a0: 0a 20 20 20 20 69 66 20 28 6d 64 20 3d 3d 20 4e . if (md == N
10b0: 55 4c 4c 20 26 26 20 74 79 70 65 20 21 3d 20 54 ULL && type != T
10c0: 59 50 45 5f 43 4d 41 43 29 20 7b 0a 09 72 65 74 YPE_CMAC) {..ret
10d0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
10e0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 }.. /* Get
10f0: 20 63 69 70 68 65 72 20 2a 2f 0a 20 20 20 20 63 cipher */. c
1100: 69 70 68 65 72 20 3d 20 55 74 69 6c 5f 47 65 74 ipher = Util_Get
1110: 43 69 70 68 65 72 28 69 6e 74 65 72 70 2c 20 63 Cipher(interp, c
1120: 69 70 68 65 72 4f 62 6a 2c 20 74 79 70 65 20 3d ipherObj, type =
1130: 3d 20 54 59 50 45 5f 43 4d 41 43 29 3b 0a 20 20 = TYPE_CMAC);.
1140: 20 20 69 66 20 28 63 69 70 68 65 72 20 3d 3d 20 if (cipher ==
1150: 4e 55 4c 4c 20 26 26 20 74 79 70 65 20 3d 3d 20 NULL && type ==
1160: 54 59 50 45 5f 43 4d 41 43 29 20 7b 0a 09 72 65 TYPE_CMAC) {..re
1170: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
1180: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 }.. /* Ge
1190: 74 20 6b 65 79 20 2a 2f 0a 20 20 20 20 6b 65 79 t key */. key
11a0: 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a = (const void *
11b0: 29 20 55 74 69 6c 5f 47 65 74 4b 65 79 28 69 6e ) Util_GetKey(in
11c0: 74 65 72 70 2c 20 6b 65 79 4f 62 6a 2c 20 26 6b terp, keyObj, &k
11d0: 65 79 5f 6c 65 6e 2c 20 22 6b 65 79 22 2c 20 30 ey_len, "key", 0
11e0: 2c 20 74 79 70 65 20 21 3d 20 54 59 50 45 5f 4d , type != TYPE_M
11f0: 44 29 3b 0a 20 20 20 20 69 66 20 28 6b 65 79 20 D);. if (key
1200: 3d 3d 20 4e 55 4c 4c 20 26 26 20 74 79 70 65 20 == NULL && type
1210: 21 3d 20 54 59 50 45 5f 4d 44 29 20 7b 0a 09 72 != TYPE_MD) {..r
1220: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
1230: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
1240: 72 65 61 74 65 20 63 6f 6e 74 65 78 74 73 20 2a reate contexts *
1250: 2f 0a 20 20 20 20 73 77 69 74 63 68 28 74 79 70 /. switch(typ
1260: 65 29 20 7b 0a 20 20 20 20 63 61 73 65 20 54 59 e) {. case TY
1270: 50 45 5f 4d 44 3a 0a 09 73 74 61 74 65 50 74 72 PE_MD:..statePtr
1280: 2d 3e 63 74 78 20 3d 20 45 56 50 5f 4d 44 5f 43 ->ctx = EVP_MD_C
1290: 54 58 5f 6e 65 77 28 29 3b 0a 09 72 65 73 20 3d TX_new();..res =
12a0: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 (statePtr->ctx
12b0: 21 3d 20 4e 55 4c 4c 29 3b 0a 09 62 72 65 61 6b != NULL);..break
12c0: 3b 0a 20 20 20 20 63 61 73 65 20 54 59 50 45 5f ;. case TYPE_
12d0: 48 4d 41 43 3a 0a 09 73 74 61 74 65 50 74 72 2d HMAC:..statePtr-
12e0: 3e 68 63 74 78 20 3d 20 48 4d 41 43 5f 43 54 58 >hctx = HMAC_CTX
12f0: 5f 6e 65 77 28 29 3b 0a 09 72 65 73 20 3d 20 28 _new();..res = (
1300: 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 20 21 statePtr->hctx !
1310: 3d 20 4e 55 4c 4c 29 3b 0a 09 62 72 65 61 6b 3b = NULL);..break;
1320: 0a 20 20 20 20 63 61 73 65 20 54 59 50 45 5f 43 . case TYPE_C
1330: 4d 41 43 3a 0a 09 73 74 61 74 65 50 74 72 2d 3e MAC:..statePtr->
1340: 63 63 74 78 20 3d 20 43 4d 41 43 5f 43 54 58 5f cctx = CMAC_CTX_
1350: 6e 65 77 28 29 3b 0a 09 72 65 73 20 3d 20 28 73 new();..res = (s
1360: 74 61 74 65 50 74 72 2d 3e 63 63 74 78 20 21 3d tatePtr->cctx !=
1370: 20 4e 55 4c 4c 29 3b 0a 09 62 72 65 61 6b 3b 0a NULL);..break;.
1380: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 21 }.. if (!
1390: 72 65 73 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 res) {..Tcl_Appe
13a0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
13b0: 20 22 43 72 65 61 74 65 20 63 6f 6e 74 65 78 74 "Create context
13c0: 20 66 61 69 6c 65 64 22 2c 20 4e 55 4c 4c 29 3b failed", NULL);
13d0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
13e0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
13f0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 63 72 79 * Initialize cry
1400: 70 74 6f 67 72 61 70 68 79 20 66 75 6e 63 74 69 ptography functi
1410: 6f 6e 20 2a 2f 0a 20 20 20 20 73 77 69 74 63 68 on */. switch
1420: 28 74 79 70 65 29 20 7b 0a 20 20 20 20 63 61 73 (type) {. cas
1430: 65 20 54 59 50 45 5f 4d 44 3a 0a 09 72 65 73 20 e TYPE_MD:..res
1440: 3d 20 45 56 50 5f 44 69 67 65 73 74 49 6e 69 74 = EVP_DigestInit
1450: 5f 65 78 28 73 74 61 74 65 50 74 72 2d 3e 63 74 _ex(statePtr->ct
1460: 78 2c 20 6d 64 2c 20 4e 55 4c 4c 29 3b 0a 09 62 x, md, NULL);..b
1470: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 reak;. case T
1480: 59 50 45 5f 48 4d 41 43 3a 0a 09 72 65 73 20 3d YPE_HMAC:..res =
1490: 20 48 4d 41 43 5f 49 6e 69 74 5f 65 78 28 73 74 HMAC_Init_ex(st
14a0: 61 74 65 50 74 72 2d 3e 68 63 74 78 2c 20 6b 65 atePtr->hctx, ke
14b0: 79 2c 20 6b 65 79 5f 6c 65 6e 2c 20 6d 64 2c 20 y, key_len, md,
14c0: 4e 55 4c 4c 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 NULL);..break;.
14d0: 20 20 20 63 61 73 65 20 54 59 50 45 5f 43 4d 41 case TYPE_CMA
14e0: 43 3a 0a 09 72 65 73 20 3d 20 43 4d 41 43 5f 49 C:..res = CMAC_I
14f0: 6e 69 74 28 73 74 61 74 65 50 74 72 2d 3e 63 63 nit(statePtr->cc
1500: 74 78 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e tx, key, key_len
1510: 2c 20 63 69 70 68 65 72 2c 20 4e 55 4c 4c 29 3b , cipher, NULL);
1520: 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a ..break;. }..
1530: 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 0a if (!res) {.
1540: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
1550: 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 69 74 69 t(interp, "Initi
1560: 61 6c 69 7a 65 20 66 61 69 6c 65 64 3a 20 22 2c alize failed: ",
1570: 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 REASON(), NULL)
1580: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
1590: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ROR;. }. r
15a0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
15b0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
15c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
15f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
1600: 44 69 67 65 73 74 55 70 64 61 74 65 20 2d 2d 0a DigestUpdate --.
1610: 20 2a 0a 20 2a 09 55 70 64 61 74 65 20 61 20 68 *. *.Update a h
1620: 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 ash function wit
1630: 68 20 64 61 74 61 0a 20 2a 0a 20 2a 20 52 65 74 h data. *. * Ret
1640: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 urns:. *.TCL_OK
1650: 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 if successful or
1660: 20 54 43 4c 5f 45 52 52 4f 52 20 66 6f 72 20 66 TCL_ERROR for f
1670: 61 69 6c 75 72 65 20 77 69 74 68 20 72 65 73 75 ailure with resu
1680: 6c 74 20 73 65 74 0a 20 2a 09 74 6f 20 65 72 72 lt set. *.to err
1690: 6f 72 20 6d 65 73 73 61 67 65 20 69 66 20 64 6f or message if do
16a0: 5f 72 65 73 75 6c 74 20 69 73 20 74 72 75 65 2e _result is true.
16b0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
16c0: 63 74 73 3a 0a 20 2a 09 41 64 64 73 20 62 75 66 cts:. *.Adds buf
16d0: 20 64 61 74 61 20 74 6f 20 68 61 73 68 20 66 75 data to hash fu
16e0: 6e 63 74 69 6f 6e 20 6f 72 20 73 65 74 73 20 72 nction or sets r
16f0: 65 73 75 6c 74 20 74 6f 20 65 72 72 6f 72 20 6d esult to error m
1700: 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d essage. *. *----
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
1750: 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 55 70 */.int DigestUp
1760: 64 61 74 65 28 44 69 67 65 73 74 53 74 61 74 65 date(DigestState
1770: 20 2a 73 74 61 74 65 50 74 72 2c 20 63 68 61 72 *statePtr, char
1780: 20 2a 62 75 66 2c 20 73 69 7a 65 5f 74 20 72 65 *buf, size_t re
1790: 61 64 2c 20 69 6e 74 20 64 6f 5f 72 65 73 75 6c ad, int do_resul
17a0: 74 29 20 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 t) {. int res
17b0: 20 3d 20 30 3b 0a 0a 20 20 20 20 64 70 72 69 6e = 0;.. dprin
17c0: 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a 20 tf("Called");..
17d0: 20 20 20 73 77 69 74 63 68 28 73 74 61 74 65 50 switch(stateP
17e0: 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 30 78 46 tr->format & 0xF
17f0: 46 30 29 20 7b 0a 20 20 20 20 63 61 73 65 20 54 F0) {. case T
1800: 59 50 45 5f 4d 44 3a 0a 20 20 20 20 20 20 20 20 YPE_MD:.
1810: 72 65 73 20 3d 20 45 56 50 5f 44 69 67 65 73 74 res = EVP_Digest
1820: 55 70 64 61 74 65 28 73 74 61 74 65 50 74 72 2d Update(statePtr-
1830: 3e 63 74 78 2c 20 62 75 66 2c 20 72 65 61 64 29 >ctx, buf, read)
1840: 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 ;..break;. ca
1850: 73 65 20 54 59 50 45 5f 48 4d 41 43 3a 0a 20 20 se TYPE_HMAC:.
1860: 20 20 20 20 20 20 72 65 73 20 3d 20 48 4d 41 43 res = HMAC
1870: 5f 55 70 64 61 74 65 28 73 74 61 74 65 50 74 72 _Update(statePtr
1880: 2d 3e 68 63 74 78 2c 20 62 75 66 2c 20 72 65 61 ->hctx, buf, rea
1890: 64 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 20 20 d);..break;.
18a0: 63 61 73 65 20 54 59 50 45 5f 43 4d 41 43 3a 0a case TYPE_CMAC:.
18b0: 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 43 4d res = CM
18c0: 41 43 5f 55 70 64 61 74 65 28 73 74 61 74 65 50 AC_Update(stateP
18d0: 74 72 2d 3e 63 63 74 78 2c 20 62 75 66 2c 20 72 tr->cctx, buf, r
18e0: 65 61 64 29 3b 0a 09 62 72 65 61 6b 3b 0a 20 20 ead);..break;.
18f0: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 21 72 65 }.. if (!re
1900: 73 20 26 26 20 64 6f 5f 72 65 73 75 6c 74 29 20 s && do_result)
1910: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
1920: 75 6c 74 28 73 74 61 74 65 50 74 72 2d 3e 69 6e ult(statePtr->in
1930: 74 65 72 70 2c 20 22 55 70 64 61 74 65 20 66 61 terp, "Update fa
1940: 69 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 iled: ", REASON(
1950: 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 ), NULL);..retur
1960: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
1970: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 }. return TC
1980: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d L_OK;.}../*. *--
1990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19d0: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 46 69 -. *. * DigestFi
19e0: 6e 61 6c 69 7a 65 20 2d 2d 0a 20 2a 0a 20 2a 09 nalize --. *. *.
19f0: 46 69 6e 61 6c 69 7a 65 20 61 20 68 61 73 68 20 Finalize a hash
1a00: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 72 65 74 function and ret
1a10: 75 72 6e 20 74 68 65 20 6d 65 73 73 61 67 65 20 urn the message
1a20: 64 69 67 65 73 74 0a 20 2a 0a 20 2a 20 52 65 74 digest. *. * Ret
1a30: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 urns:. *.TCL_OK
1a40: 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 if successful or
1a50: 20 54 43 4c 5f 45 52 52 4f 52 20 66 6f 72 20 66 TCL_ERROR for f
1a60: 61 69 6c 75 72 65 20 77 69 74 68 20 72 65 73 75 ailure with resu
1a70: 6c 74 20 73 65 74 0a 20 2a 09 74 6f 20 65 72 72 lt set. *.to err
1a80: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 or message.. *.
1a90: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
1aa0: 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20 74 *.Sets result t
1ab0: 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 o message digest
1ac0: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 or an error mes
1ad0: 73 61 67 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d sage.. *. *-----
1ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
1b20: 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 46 69 6e */.int DigestFin
1b30: 61 6c 69 7a 65 28 54 63 6c 5f 49 6e 74 65 72 70 alize(Tcl_Interp
1b40: 20 2a 69 6e 74 65 72 70 2c 20 44 69 67 65 73 74 *interp, Digest
1b50: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 2c State *statePtr,
1b60: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 72 65 73 75 6c Tcl_Obj **resul
1b70: 74 4f 62 6a 29 20 7b 0a 20 20 20 20 75 6e 73 69 tObj) {. unsi
1b80: 67 6e 65 64 20 63 68 61 72 20 6d 64 5f 62 75 66 gned char md_buf
1b90: 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 [EVP_MAX_MD_SIZE
1ba0: 5d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 ];. unsigned
1bb0: 69 6e 74 20 75 6c 65 6e 3b 0a 20 20 20 20 69 6e int ulen;. in
1bc0: 74 20 72 65 73 20 3d 20 30 2c 20 6d 64 5f 6c 65 t res = 0, md_le
1bd0: 6e 20 3d 20 30 2c 20 74 79 70 65 20 3d 20 73 74 n = 0, type = st
1be0: 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 atePtr->format &
1bf0: 20 30 78 46 46 30 3b 0a 0a 20 20 20 20 64 70 72 0xFF0;.. dpr
1c00: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
1c10: 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 . /* Finalize
1c20: 20 63 72 79 70 74 6f 67 72 61 70 68 79 20 66 75 cryptography fu
1c30: 6e 63 74 69 6f 6e 20 61 6e 64 20 67 65 74 20 72 nction and get r
1c40: 65 73 75 6c 74 20 2a 2f 0a 20 20 20 20 73 77 69 esult */. swi
1c50: 74 63 68 28 74 79 70 65 29 20 7b 0a 20 20 20 20 tch(type) {.
1c60: 63 61 73 65 20 54 59 50 45 5f 4d 44 3a 0a 09 69 case TYPE_MD:..i
1c70: 66 20 28 21 28 73 74 61 74 65 50 74 72 2d 3e 66 f (!(statePtr->f
1c80: 6f 72 6d 61 74 20 26 20 49 53 5f 58 4f 46 29 29 ormat & IS_XOF))
1c90: 20 7b 0a 09 20 20 20 20 72 65 73 20 3d 20 45 56 {.. res = EV
1ca0: 50 5f 44 69 67 65 73 74 46 69 6e 61 6c 5f 65 78 P_DigestFinal_ex
1cb0: 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 (statePtr->ctx,
1cc0: 6d 64 5f 62 75 66 2c 20 26 75 6c 65 6e 29 3b 0a md_buf, &ulen);.
1cd0: 09 20 20 20 20 6d 64 5f 6c 65 6e 20 3d 20 28 69 . md_len = (i
1ce0: 6e 74 29 20 75 6c 65 6e 3b 0a 09 7d 20 65 6c 73 nt) ulen;..} els
1cf0: 65 20 7b 0a 09 20 20 20 20 72 65 73 20 3d 20 45 e {.. res = E
1d00: 56 50 5f 44 69 67 65 73 74 46 69 6e 61 6c 58 4f VP_DigestFinalXO
1d10: 46 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c F(statePtr->ctx,
1d20: 20 6d 64 5f 62 75 66 2c 20 28 73 69 7a 65 5f 74 md_buf, (size_t
1d30: 29 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a ) EVP_MAX_MD_SIZ
1d40: 45 29 3b 0a 09 20 20 20 20 6d 64 5f 6c 65 6e 20 E);.. md_len
1d50: 3d 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a = EVP_MAX_MD_SIZ
1d60: 45 3b 0a 09 7d 0a 09 62 72 65 61 6b 3b 0a 20 20 E;..}..break;.
1d70: 20 20 63 61 73 65 20 54 59 50 45 5f 48 4d 41 43 case TYPE_HMAC
1d80: 3a 0a 09 72 65 73 20 3d 20 48 4d 41 43 5f 46 69 :..res = HMAC_Fi
1d90: 6e 61 6c 28 73 74 61 74 65 50 74 72 2d 3e 68 63 nal(statePtr->hc
1da0: 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26 75 6c 65 tx, md_buf, &ule
1db0: 6e 29 3b 0a 09 6d 64 5f 6c 65 6e 20 3d 20 28 69 n);..md_len = (i
1dc0: 6e 74 29 20 75 6c 65 6e 3b 0a 09 62 72 65 61 6b nt) ulen;..break
1dd0: 3b 0a 20 20 20 20 63 61 73 65 20 54 59 50 45 5f ;. case TYPE_
1de0: 43 4d 41 43 3a 0a 09 73 69 7a 65 5f 74 20 73 69 CMAC:..size_t si
1df0: 7a 65 3b 0a 09 72 65 73 20 3d 20 43 4d 41 43 5f ze;..res = CMAC_
1e00: 46 69 6e 61 6c 28 73 74 61 74 65 50 74 72 2d 3e Final(statePtr->
1e10: 63 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26 73 cctx, md_buf, &s
1e20: 69 7a 65 29 3b 0a 09 6d 64 5f 6c 65 6e 20 3d 20 ize);..md_len =
1e30: 28 69 6e 74 29 20 73 69 7a 65 3b 0a 09 62 72 65 (int) size;..bre
1e40: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 ak;. }.. i
1e50: 66 20 28 21 72 65 73 29 20 7b 0a 09 69 66 20 28 f (!res) {..if (
1e60: 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 4e 55 4c resultObj == NUL
1e70: 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 L) {.. Tcl_Ap
1e80: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
1e90: 70 2c 20 22 46 69 6e 61 6c 69 7a 65 20 66 61 69 p, "Finalize fai
1ea0: 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 led: ", REASON()
1eb0: 2c 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 72 65 74 , NULL);..}..ret
1ec0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
1ed0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 74 }.. /* Ret
1ee0: 75 72 6e 20 6d 65 73 73 61 67 65 20 64 69 67 65 urn message dige
1ef0: 73 74 20 61 73 20 65 69 74 68 65 72 20 61 20 62 st as either a b
1f00: 69 6e 61 72 79 20 6f 72 20 68 65 78 20 73 74 72 inary or hex str
1f10: 69 6e 67 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 ing */. if (s
1f20: 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 tatePtr->format
1f30: 26 20 42 49 4e 5f 46 4f 52 4d 41 54 29 20 7b 0a & BIN_FORMAT) {.
1f40: 09 69 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d .if (resultObj =
1f50: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 = NULL) {.. T
1f60: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
1f70: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 interp, Tcl_NewB
1f80: 79 74 65 41 72 72 61 79 4f 62 6a 28 6d 64 5f 62 yteArrayObj(md_b
1f90: 75 66 2c 20 6d 64 5f 6c 65 6e 29 29 3b 0a 09 7d uf, md_len));..}
1fa0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 2a 72 65 else {.. *re
1fb0: 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 sultObj = Tcl_Ne
1fc0: 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 6d 64 wByteArrayObj(md
1fd0: 5f 62 75 66 2c 20 6d 64 5f 6c 65 6e 29 3b 0a 09 _buf, md_len);..
1fe0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
1ff0: 6f 75 6e 74 28 2a 72 65 73 75 6c 74 4f 62 6a 29 ount(*resultObj)
2000: 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 65 6c 73 65 ;..}.. } else
2010: 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6e 65 77 {..Tcl_Obj *new
2020: 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a Obj = Tcl_NewObj
2030: 28 29 3b 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 ();..unsigned ch
2040: 61 72 20 2a 70 74 72 20 3d 20 54 63 6c 5f 53 65 ar *ptr = Tcl_Se
2050: 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67 74 68 tByteArrayLength
2060: 28 6e 65 77 4f 62 6a 2c 20 6d 64 5f 6c 65 6e 2a (newObj, md_len*
2070: 32 29 3b 0a 0a 09 66 6f 72 20 28 69 6e 74 20 69 2);...for (int i
2080: 20 3d 20 30 3b 20 69 20 3c 20 6d 64 5f 6c 65 6e = 0; i < md_len
2090: 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 2a 70 ; i++) {.. *p
20a0: 74 72 2b 2b 20 3d 20 68 65 78 5b 28 6d 64 5f 62 tr++ = hex[(md_b
20b0: 75 66 5b 69 5d 20 3e 3e 20 34 29 20 26 20 30 78 uf[i] >> 4) & 0x
20c0: 30 46 5d 3b 0a 09 20 20 20 20 2a 70 74 72 2b 2b 0F];.. *ptr++
20d0: 20 3d 20 68 65 78 5b 6d 64 5f 62 75 66 5b 69 5d = hex[md_buf[i]
20e0: 20 26 20 30 78 30 46 5d 3b 0a 09 7d 0a 0a 09 69 & 0x0F];..}...i
20f0: 66 20 28 72 65 73 75 6c 74 4f 62 6a 20 3d 3d 20 f (resultObj ==
2100: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 63 6c NULL) {.. Tcl
2110: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
2120: 74 65 72 70 2c 20 6e 65 77 4f 62 6a 29 3b 0a 09 terp, newObj);..
2130: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 2a 72 } else {.. *r
2140: 65 73 75 6c 74 4f 62 6a 20 3d 20 6e 65 77 4f 62 esultObj = newOb
2150: 6a 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 j;.. Tcl_Incr
2160: 52 65 66 43 6f 75 6e 74 28 2a 72 65 73 75 6c 74 RefCount(*result
2170: 4f 62 6a 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 Obj);..}. }.
2180: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
2190: 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ;.}../**********
21a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
21b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
21c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
21d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 *********/../*.
21e0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2220: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 ----. *. * Diges
2230: 74 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 20 2d tBlockModeProc -
2240: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e -. *. *.This fun
2250: 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 ction is invoked
2260: 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 by the generic
2270: 49 4f 20 6c 65 76 65 6c 0a 20 2a 09 74 6f 20 73 IO level. *.to s
2280: 65 74 20 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 20 et blocking and
2290: 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 nonblocking mode
22a0: 73 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 s.. *. * Returns
22b0: 3a 0a 20 2a 09 30 20 69 66 20 73 75 63 63 65 73 :. *.0 if succes
22c0: 73 66 75 6c 20 6f 72 20 50 4f 53 49 58 20 65 72 sful or POSIX er
22d0: 72 6f 72 20 63 6f 64 65 20 69 66 20 66 61 69 6c ror code if fail
22e0: 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ed.. *. * Side e
22f0: 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 ffects:. *.Sets
2300: 74 68 65 20 64 65 76 69 63 65 20 69 6e 74 6f 20 the device into
2310: 62 6c 6f 63 6b 69 6e 67 20 6f 72 20 6e 6f 6e 62 blocking or nonb
2320: 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a 20 2a locking mode.. *
2330: 09 43 61 6e 20 63 61 6c 6c 20 54 63 6c 5f 53 65 .Can call Tcl_Se
2340: 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72 2e 0a 20 tChannelError..
2350: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
2360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2390: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
23a0: 69 63 20 69 6e 74 20 44 69 67 65 73 74 42 6c 6f ic int DigestBlo
23b0: 63 6b 4d 6f 64 65 50 72 6f 63 28 43 6c 69 65 6e ckModeProc(Clien
23c0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
23d0: 2c 20 69 6e 74 20 6d 6f 64 65 29 20 7b 0a 20 20 , int mode) {.
23e0: 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 DigestState *s
23f0: 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 tatePtr = (Diges
2400: 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 tState *) client
2410: 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 28 6d Data;.. if (m
2420: 6f 64 65 20 3d 3d 20 54 43 4c 5f 4d 4f 44 45 5f ode == TCL_MODE_
2430: 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29 20 7b 0a 09 NONBLOCKING) {..
2440: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
2450: 7c 3d 20 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 |= TLS_TCL_ASYNC
2460: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
2470: 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 statePtr->flags
2480: 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 41 53 59 &= ~(TLS_TCL_ASY
2490: 4e 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 NC);. }. r
24a0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 eturn 0;.}../*.
24b0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
24c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
24f0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 ----. *. * Diges
2500: 74 43 6c 6f 73 65 50 72 6f 63 20 2d 2d 0a 20 2a tCloseProc --. *
2510: 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f . *.This functio
2520: 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 n is invoked by
2530: 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c the generic IO l
2540: 65 76 65 6c 20 74 6f 20 70 65 72 66 6f 72 6d 0a evel to perform.
2550: 20 2a 09 63 68 61 6e 6e 65 6c 2d 74 79 70 65 20 *.channel-type
2560: 73 70 65 63 69 66 69 63 20 63 6c 65 61 6e 75 70 specific cleanup
2570: 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 6e 65 when the channe
2580: 6c 20 69 73 20 63 6c 6f 73 65 64 2e 20 41 6c 6c l is closed. All
2590: 0a 20 2a 09 71 75 65 75 65 64 20 6f 75 74 70 75 . *.queued outpu
25a0: 74 20 69 73 20 66 6c 75 73 68 65 64 20 70 72 69 t is flushed pri
25b0: 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 or to calling th
25c0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a is function.. *.
25d0: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 30 * Returns:. *.0
25e0: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f if successful o
25f0: 72 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63 6f r POSIX error co
2600: 64 65 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a de if failed.. *
2610: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
2620: 3a 0a 20 2a 09 44 65 6c 65 74 65 73 20 73 74 6f :. *.Deletes sto
2630: 72 65 64 20 73 74 61 74 65 20 64 61 74 61 2e 0a red state data..
2640: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
2650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2680: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 --------. */.int
2690: 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 DigestCloseProc
26a0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
26b0: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
26c0: 72 70 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 rp *interp) {.
26d0: 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 DigestState *s
26e0: 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 tatePtr = (Diges
26f0: 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 tState *) client
2700: 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 Data;.. /* Ca
2710: 6e 63 65 6c 20 61 63 74 69 76 65 20 74 69 6d 65 ncel active time
2720: 72 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 20 r, if any */.
2730: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 if (statePtr->t
2740: 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d imer != (Tcl_Tim
2750: 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b erToken) NULL) {
2760: 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 ..Tcl_DeleteTime
2770: 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 rHandler(statePt
2780: 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 r->timer);..stat
2790: 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 ePtr->timer = (T
27a0: 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e cl_TimerToken) N
27b0: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
27c0: 2f 2a 20 4f 75 74 70 75 74 20 6d 65 73 73 61 67 /* Output messag
27d0: 65 20 64 69 67 65 73 74 20 69 66 20 6e 6f 74 20 e digest if not
27e0: 61 6c 72 65 61 64 79 20 64 6f 6e 65 20 2a 2f 0a already done */.
27f0: 20 20 20 20 69 66 20 28 21 28 73 74 61 74 65 50 if (!(stateP
2800: 74 72 2d 3e 66 6c 61 67 73 20 26 20 43 48 41 4e tr->flags & CHAN
2810: 5f 45 4f 46 29 29 20 7b 0a 09 54 63 6c 5f 43 68 _EOF)) {..Tcl_Ch
2820: 61 6e 6e 65 6c 20 70 61 72 65 6e 74 20 3d 20 54 annel parent = T
2830: 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68 61 cl_GetStackedCha
2840: 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 nnel(statePtr->s
2850: 65 6c 66 29 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a elf);..Tcl_Obj *
2860: 72 65 73 75 6c 74 4f 62 6a 3b 0a 09 69 6e 74 20 resultObj;..int
2870: 77 72 69 74 74 65 6e 3b 0a 0a 09 69 66 20 28 44 written;...if (D
2880: 69 67 65 73 74 46 69 6e 61 6c 69 7a 65 28 73 74 igestFinalize(st
2890: 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 atePtr->interp,
28a0: 73 74 61 74 65 50 74 72 2c 20 26 72 65 73 75 6c statePtr, &resul
28b0: 74 4f 62 6a 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 tObj) == TCL_OK)
28c0: 20 7b 0a 09 20 20 20 20 75 6e 73 69 67 6e 65 64 {.. unsigned
28d0: 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 54 63 char *data = Tc
28e0: 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 l_GetByteArrayFr
28f0: 6f 6d 4f 62 6a 28 72 65 73 75 6c 74 4f 62 6a 2c omObj(resultObj,
2900: 20 26 77 72 69 74 74 65 6e 29 3b 0a 09 20 20 20 &written);..
2910: 20 54 63 6c 5f 57 72 69 74 65 52 61 77 28 70 61 Tcl_WriteRaw(pa
2920: 72 65 6e 74 2c 20 64 61 74 61 2c 20 77 72 69 74 rent, data, writ
2930: 74 65 6e 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 ten);.. Tcl_D
2940: 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65 73 75 ecrRefCount(resu
2950: 6c 74 4f 62 6a 29 3b 0a 09 7d 0a 09 73 74 61 74 ltObj);..}..stat
2960: 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 ePtr->flags |= C
2970: 48 41 4e 5f 45 4f 46 3b 0a 20 20 20 20 7d 0a 0a HAN_EOF;. }..
2980: 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20 /* Clean-up
2990: 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 */. DigestSta
29a0: 74 65 46 72 65 65 28 73 74 61 74 65 50 74 72 29 teFree(statePtr)
29b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a ;. return 0;.
29c0: 7d 0a 0a 2f 2a 0a 20 2a 20 53 61 6d 65 20 61 73 }../*. * Same as
29d0: 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 DigestCloseProc
29e0: 20 62 75 74 20 77 69 74 68 20 69 6e 64 69 76 69 but with indivi
29f0: 64 75 61 6c 20 72 65 61 64 20 61 6e 64 20 77 72 dual read and wr
2a00: 69 74 65 20 63 6c 6f 73 65 20 63 6f 6e 74 72 6f ite close contro
2a10: 6c 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 l. */.static int
2a20: 20 44 69 67 65 73 74 43 6c 6f 73 65 32 50 72 6f DigestClose2Pro
2a30: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 6e 73 c(ClientData ins
2a40: 74 61 6e 63 65 44 61 74 61 2c 20 54 63 6c 5f 49 tanceData, Tcl_I
2a50: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
2a60: 6e 74 20 66 6c 61 67 73 29 20 7b 0a 0a 20 20 20 nt flags) {..
2a70: 20 69 66 20 28 28 66 6c 61 67 73 20 26 20 28 54 if ((flags & (T
2a80: 43 4c 5f 43 4c 4f 53 45 5f 52 45 41 44 20 7c 20 CL_CLOSE_READ |
2a90: 54 43 4c 5f 43 4c 4f 53 45 5f 57 52 49 54 45 29 TCL_CLOSE_WRITE)
2aa0: 29 20 3d 3d 20 30 29 20 7b 0a 09 72 65 74 75 72 ) == 0) {..retur
2ab0: 6e 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f n DigestClosePro
2ac0: 63 28 69 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 c(instanceData,
2ad0: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d 0a 20 interp);. }.
2ae0: 20 20 20 72 65 74 75 72 6e 20 45 49 4e 56 41 4c return EINVAL
2af0: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ;.}../*. *------
2b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b40: 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 49 6e 70 . *. * DigestInp
2b50: 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 utProc --. *. *.
2b60: 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 Called by the ge
2b70: 6e 65 72 69 63 20 49 4f 20 73 79 73 74 65 6d 20 neric IO system
2b80: 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 72 6f to read data fro
2b90: 6d 20 74 72 61 6e 73 66 6f 72 6d 20 61 6e 64 0a m transform and.
2ba0: 20 2a 09 70 6c 61 63 65 20 69 6e 20 62 75 66 2e *.place in buf.
2bb0: 20 54 72 61 6e 73 66 6f 72 6d 20 67 65 74 73 20 Transform gets
2bc0: 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 75 6e data from the un
2bd0: 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c derlying channel
2be0: 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a .. *. * Returns:
2bf0: 0a 20 2a 09 54 6f 74 61 6c 20 62 79 74 65 73 20 . *.Total bytes
2c00: 72 65 61 64 20 6f 72 20 2d 31 20 66 6f 72 20 61 read or -1 for a
2c10: 6e 20 65 72 72 6f 72 20 61 6c 6f 6e 67 20 77 69 n error along wi
2c20: 74 68 20 61 20 50 4f 53 49 58 20 65 72 72 6f 72 th a POSIX error
2c30: 0a 20 2a 09 63 6f 64 65 20 69 6e 20 65 72 72 6f . *.code in erro
2c40: 72 43 6f 64 65 50 74 72 2e 20 55 73 65 20 45 41 rCodePtr. Use EA
2c50: 47 41 49 4e 20 66 6f 72 20 6e 6f 6e 62 6c 6f 63 GAIN for nonbloc
2c60: 6b 69 6e 67 20 61 6e 64 20 6e 6f 20 64 61 74 61 king and no data
2c70: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
2c80: 65 63 74 73 3a 0a 20 2a 09 52 65 61 64 20 64 61 ects:. *.Read da
2c90: 74 61 20 66 72 6f 6d 20 74 72 61 6e 73 66 6f 72 ta from transfor
2ca0: 6d 20 61 6e 64 20 77 72 69 74 65 20 74 6f 20 62 m and write to b
2cb0: 75 66 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d uf. *. *--------
2cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
2d00: 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 49 6e 70 */.int DigestInp
2d10: 75 74 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 utProc(ClientDat
2d20: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 63 68 a clientData, ch
2d30: 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 74 6f 52 ar *buf, int toR
2d40: 65 61 64 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 ead, int *errorC
2d50: 6f 64 65 50 74 72 29 20 7b 0a 20 20 20 20 44 69 odePtr) {. Di
2d60: 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 gestState *state
2d70: 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 Ptr = (DigestSta
2d80: 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 te *) clientData
2d90: 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 ;. Tcl_Channe
2da0: 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 69 6e l parent;. in
2db0: 74 20 72 65 61 64 3b 0a 20 20 20 20 2a 65 72 72 t read;. *err
2dc0: 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a 0a orCodePtr = 0;..
2dd0: 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 20 /* Abort if
2de0: 6e 6f 74 68 69 6e 67 20 74 6f 20 70 72 6f 63 65 nothing to proce
2df0: 73 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 74 6f ss */. if (to
2e00: 52 65 61 64 20 3c 3d 20 30 20 7c 7c 20 73 74 61 Read <= 0 || sta
2e10: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 tePtr->self == (
2e20: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
2e30: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a L) {..return 0;.
2e40: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 }.. /* Ge
2e50: 74 20 62 79 74 65 73 20 66 72 6f 6d 20 75 6e 64 t bytes from und
2e60: 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 20 erlying channel
2e70: 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 20 3d 20 */. parent =
2e80: 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68 Tcl_GetStackedCh
2e90: 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e annel(statePtr->
2ea0: 73 65 6c 66 29 3b 0a 20 20 20 20 72 65 61 64 20 self);. read
2eb0: 3d 20 54 63 6c 5f 52 65 61 64 52 61 77 28 70 61 = Tcl_ReadRaw(pa
2ec0: 72 65 6e 74 2c 20 62 75 66 2c 20 74 6f 52 65 61 rent, buf, toRea
2ed0: 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 d);.. /* Upda
2ee0: 74 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e te hash function
2ef0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 61 64 */. if (read
2f00: 20 3e 20 30 29 20 7b 0a 09 2f 2a 20 48 61 76 65 > 0) {../* Have
2f10: 20 64 61 74 61 20 2a 2f 0a 09 69 66 20 28 44 69 data */..if (Di
2f20: 67 65 73 74 55 70 64 61 74 65 28 73 74 61 74 65 gestUpdate(state
2f30: 50 74 72 2c 20 62 75 66 2c 20 28 73 69 7a 65 5f Ptr, buf, (size_
2f40: 74 29 20 72 65 61 64 2c 20 30 29 20 21 3d 20 54 t) read, 0) != T
2f50: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 63 CL_OK) {.. Tc
2f60: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f l_SetChannelErro
2f70: 72 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 r(statePtr->self
2f80: 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 , Tcl_ObjPrintf(
2f90: 22 55 70 64 61 74 65 20 66 61 69 6c 65 64 3a 20 "Update failed:
2fa0: 25 73 22 2c 20 52 45 41 53 4f 4e 28 29 29 29 3b %s", REASON()));
2fb0: 0a 09 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 .. *errorCode
2fc0: 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 20 Ptr = EINVAL;..
2fd0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 09 7d 0a return 0;..}.
2fe0: 09 2f 2a 20 54 68 69 73 20 69 73 20 63 6f 72 72 ./* This is corr
2ff0: 65 63 74 20 2a 2f 0a 09 72 65 61 64 20 3d 20 2d ect */..read = -
3000: 31 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 1;..*errorCodePt
3010: 72 20 3d 20 45 41 47 41 49 4e 3b 0a 0a 20 20 20 r = EAGAIN;..
3020: 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 61 64 } else if (read
3030: 20 3c 20 30 29 20 7b 0a 09 2f 2a 20 45 72 72 6f < 0) {../* Erro
3040: 72 20 2a 2f 0a 09 2a 65 72 72 6f 72 43 6f 64 65 r */..*errorCode
3050: 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 72 Ptr = Tcl_GetErr
3060: 6e 6f 28 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 no();.. } els
3070: 65 20 69 66 20 28 21 28 73 74 61 74 65 50 74 72 e if (!(statePtr
3080: 2d 3e 66 6c 61 67 73 20 26 20 43 48 41 4e 5f 45 ->flags & CHAN_E
3090: 4f 46 29 29 20 7b 0a 09 2f 2a 20 45 4f 46 20 2a OF)) {../* EOF *
30a0: 2f 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 /..Tcl_Obj *resu
30b0: 6c 74 4f 62 6a 3b 0a 09 69 66 20 28 44 69 67 65 ltObj;..if (Dige
30c0: 73 74 46 69 6e 61 6c 69 7a 65 28 73 74 61 74 65 stFinalize(state
30d0: 50 74 72 2d 3e 69 6e 74 65 72 70 2c 20 73 74 61 Ptr->interp, sta
30e0: 74 65 50 74 72 2c 20 26 72 65 73 75 6c 74 4f 62 tePtr, &resultOb
30f0: 6a 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a j) == TCL_OK) {.
3100: 09 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 . unsigned ch
3110: 61 72 20 2a 64 61 74 61 20 3d 20 54 63 6c 5f 47 ar *data = Tcl_G
3120: 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f etByteArrayFromO
3130: 62 6a 28 72 65 73 75 6c 74 4f 62 6a 2c 20 26 72 bj(resultObj, &r
3140: 65 61 64 29 3b 0a 09 20 20 20 20 6d 65 6d 63 70 ead);.. memcp
3150: 79 28 62 75 66 2c 20 64 61 74 61 2c 20 72 65 61 y(buf, data, rea
3160: 64 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 d);.. Tcl_Dec
3170: 72 52 65 66 43 6f 75 6e 74 28 72 65 73 75 6c 74 rRefCount(result
3180: 4f 62 6a 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b Obj);...} else {
3190: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 .. Tcl_SetCha
31a0: 6e 6e 65 6c 45 72 72 6f 72 28 73 74 61 74 65 50 nnelError(stateP
31b0: 74 72 2d 3e 73 65 6c 66 2c 20 54 63 6c 5f 4f 62 tr->self, Tcl_Ob
31c0: 6a 50 72 69 6e 74 66 28 22 46 69 6e 61 6c 69 7a jPrintf("Finaliz
31d0: 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 52 e failed: %s", R
31e0: 45 41 53 4f 4e 28 29 29 29 3b 0a 09 20 20 20 20 EASON()));..
31f0: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
3200: 45 49 4e 56 41 4c 3b 0a 09 20 20 20 20 72 65 61 EINVAL;.. rea
3210: 64 20 3d 20 30 3b 0a 09 7d 0a 09 73 74 61 74 65 d = 0;..}..state
3220: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 48 Ptr->flags |= CH
3230: 41 4e 5f 45 4f 46 3b 0a 20 20 20 20 7d 0a 20 20 AN_EOF;. }.
3240: 20 20 72 65 74 75 72 6e 20 72 65 61 64 3b 0a 7d return read;.}
3250: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
3260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
32a0: 0a 20 2a 20 44 69 67 65 73 74 4f 75 74 70 75 74 . * DigestOutput
32b0: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 Proc --. *. *.Ca
32c0: 6c 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 lled by the gene
32d0: 72 69 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f ric IO system to
32e0: 20 77 72 69 74 65 20 64 61 74 61 20 69 6e 20 62 write data in b
32f0: 75 66 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 2e uf to transform.
3300: 0a 20 2a 09 54 68 65 20 74 72 61 6e 73 66 6f 72 . *.The transfor
3310: 6d 20 77 72 69 74 65 73 20 74 68 65 20 72 65 73 m writes the res
3320: 75 6c 74 20 74 6f 20 74 68 65 20 75 6e 64 65 72 ult to the under
3330: 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 0a 20 lying channel..
3340: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a *. * Returns:. *
3350: 09 54 6f 74 61 6c 20 62 79 74 65 73 20 77 72 69 .Total bytes wri
3360: 74 74 65 6e 20 6f 72 20 2d 31 20 66 6f 72 20 61 tten or -1 for a
3370: 6e 20 65 72 72 6f 72 20 61 6c 6f 6e 67 20 77 69 n error along wi
3380: 74 68 20 61 20 50 4f 53 49 58 20 65 72 72 6f 72 th a POSIX error
3390: 0a 20 2a 09 63 6f 64 65 20 69 6e 20 65 72 72 6f . *.code in erro
33a0: 72 43 6f 64 65 50 74 72 2e 20 55 73 65 20 45 41 rCodePtr. Use EA
33b0: 47 41 49 4e 20 66 6f 72 20 6e 6f 6e 62 6c 6f 63 GAIN for nonbloc
33c0: 6b 69 6e 67 20 61 6e 64 20 63 61 6e 27 74 20 77 king and can't w
33d0: 72 69 74 65 20 64 61 74 61 2e 0a 20 2a 0a 20 2a rite data.. *. *
33e0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
33f0: 2a 09 47 65 74 20 64 61 74 61 20 66 72 6f 6d 20 *.Get data from
3400: 62 75 66 20 61 6e 64 20 75 70 64 61 74 65 20 64 buf and update d
3410: 69 67 65 73 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d igest. *. *-----
3420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3460: 2d 0a 20 2a 2f 0a 20 69 6e 74 20 44 69 67 65 73 -. */. int Diges
3470: 74 4f 75 74 70 75 74 50 72 6f 63 28 43 6c 69 65 tOutputProc(Clie
3480: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
3490: 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 62 a, const char *b
34a0: 75 66 2c 20 69 6e 74 20 74 6f 57 72 69 74 65 2c uf, int toWrite,
34b0: 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 50 int *errorCodeP
34c0: 74 72 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 tr) {. Digest
34d0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
34e0: 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a = (DigestState *
34f0: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 ) clientData;.
3500: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 *errorCodePtr
3510: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f = 0;.. /* Abo
3520: 72 74 20 69 66 20 6e 6f 74 68 69 6e 67 20 74 6f rt if nothing to
3530: 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 20 20 process */.
3540: 69 66 20 28 74 6f 57 72 69 74 65 20 3c 3d 20 30 if (toWrite <= 0
3550: 20 7c 7c 20 73 74 61 74 65 50 74 72 2d 3e 73 65 || statePtr->se
3560: 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e lf == (Tcl_Chann
3570: 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 el) NULL) {..ret
3580: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 urn 0;. }..
3590: 20 20 2f 2a 20 55 70 64 61 74 65 20 68 61 73 68 /* Update hash
35a0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 function */.
35b0: 20 69 66 20 28 44 69 67 65 73 74 55 70 64 61 74 if (DigestUpdat
35c0: 65 28 73 74 61 74 65 50 74 72 2c 20 62 75 66 2c e(statePtr, buf,
35d0: 20 28 73 69 7a 65 5f 74 29 20 74 6f 57 72 69 74 (size_t) toWrit
35e0: 65 2c 20 30 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 e, 0) != TCL_OK)
35f0: 20 7b 0a 09 54 63 6c 5f 53 65 74 43 68 61 6e 6e {..Tcl_SetChann
3600: 65 6c 45 72 72 6f 72 28 73 74 61 74 65 50 74 72 elError(statePtr
3610: 2d 3e 73 65 6c 66 2c 20 54 63 6c 5f 4f 62 6a 50 ->self, Tcl_ObjP
3620: 72 69 6e 74 66 28 22 55 70 64 61 74 65 20 66 61 rintf("Update fa
3630: 69 6c 65 64 3a 20 25 73 22 2c 20 52 45 41 53 4f iled: %s", REASO
3640: 4e 28 29 29 29 3b 0a 09 2a 65 72 72 6f 72 43 6f N()));..*errorCo
3650: 64 65 50 74 72 20 3d 20 45 49 4e 56 41 4c 3b 0a dePtr = EINVAL;.
3660: 09 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d .return 0;. }
3670: 0a 20 20 20 20 72 65 74 75 72 6e 20 74 6f 57 72 . return toWr
3680: 69 74 65 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d ite;.}../*. *---
3690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
36d0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 ---. *. * Digest
36e0: 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2d 2d SetOptionProc --
36f0: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 . *. *.Called by
3700: 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 the generic IO
3710: 73 79 73 74 65 6d 20 74 6f 20 73 65 74 20 63 68 system to set ch
3720: 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 6e 61 6d annel option nam
3730: 65 20 74 6f 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 e to value.. *.
3740: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 * Returns:. *.TC
3750: 4c 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 L_OK if successf
3760: 75 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 ul or TCL_ERROR
3770: 69 66 20 66 61 69 6c 65 64 20 61 6c 6f 6e 67 20 if failed along
3780: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 0a 20 2a with an error. *
3790: 09 6d 65 73 73 61 67 65 20 69 6e 20 69 6e 74 65 .message in inte
37a0: 72 70 20 61 6e 64 20 54 63 6c 5f 53 65 74 45 72 rp and Tcl_SetEr
37b0: 72 6e 6f 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 rno.. *. * Side
37c0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 55 70 64 61 effects:. *.Upda
37d0: 74 65 73 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69 tes channel opti
37e0: 6f 6e 20 74 6f 20 6e 65 77 20 76 61 6c 75 65 2e on to new value.
37f0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
3800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
3840: 0a 73 74 61 74 69 63 20 69 6e 74 20 44 69 67 65 .static int Dige
3850: 73 74 53 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 stSetOptionProc(
3860: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
3870: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
3880: 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 p *interp, const
3890: 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d char *optionNam
38a0: 65 2c 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a e,..const char *
38b0: 6f 70 74 69 6f 6e 56 61 6c 75 65 29 20 7b 0a 20 optionValue) {.
38c0: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a DigestState *
38d0: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 statePtr = (Dige
38e0: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e stState *) clien
38f0: 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43 tData;. Tcl_C
3900: 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20 hannel parent;.
3910: 20 20 20 54 63 6c 5f 44 72 69 76 65 72 53 65 74 Tcl_DriverSet
3920: 4f 70 74 69 6f 6e 50 72 6f 63 20 2a 73 65 74 4f OptionProc *setO
3930: 70 74 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 ptionProc;..
3940: 2f 2a 20 41 62 6f 72 74 20 69 66 20 6e 6f 20 63 /* Abort if no c
3950: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 hannel */. if
3960: 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 (statePtr->self
3970: 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c == (Tcl_Channel
3980: 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 ) NULL) {..retur
3990: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
39a0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 67 }.. /* Deleg
39b0: 61 74 65 20 6f 70 74 69 6f 6e 73 20 64 6f 77 6e ate options down
39c0: 73 74 72 65 61 6d 20 2a 2f 0a 20 20 20 20 70 61 stream */. pa
39d0: 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 rent = Tcl_GetSt
39e0: 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 ackedChannel(sta
39f0: 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 tePtr->self);.
3a00: 20 20 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 setOptionProc
3a10: 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 53 65 74 = Tcl_ChannelSet
3a20: 4f 70 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 OptionProc(Tcl_G
3a30: 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 70 61 etChannelType(pa
3a40: 72 65 6e 74 29 29 3b 0a 20 20 20 20 69 66 20 28 rent));. if (
3a50: 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d setOptionProc !=
3a60: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
3a70: 20 28 2a 73 65 74 4f 70 74 69 6f 6e 50 72 6f 63 (*setOptionProc
3a80: 29 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c )(Tcl_GetChannel
3a90: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 70 61 72 InstanceData(par
3aa0: 65 6e 74 29 2c 20 69 6e 74 65 72 70 2c 20 6f 70 ent), interp, op
3ab0: 74 69 6f 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e tionName, option
3ac0: 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d 20 65 6c Value);. } el
3ad0: 73 65 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 se {..Tcl_SetErr
3ae0: 6e 6f 28 45 49 4e 56 41 4c 29 3b 0a 09 72 65 74 no(EINVAL);..ret
3af0: 75 72 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e urn Tcl_BadChann
3b00: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
3b10: 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 4e 55 4c optionName, NUL
3b20: 4c 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a L);. }.}../*.
3b30: 20 2a 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 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 --------. *. * D
3b80: 69 67 65 73 74 47 65 74 4f 70 74 69 6f 6e 50 72 igestGetOptionPr
3b90: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c oc --. *. *.Call
3ba0: 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 69 ed by the generi
3bb0: 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f 20 67 c IO system to g
3bc0: 65 74 20 63 68 61 6e 6e 65 6c 20 6f 70 74 69 6f et channel optio
3bd0: 6e 20 6e 61 6d 65 27 73 20 76 61 6c 75 65 2e 0a n name's value..
3be0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 *. * Returns:.
3bf0: 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 73 75 63 63 *.TCL_OK if succ
3c00: 65 73 73 66 75 6c 20 6f 72 20 54 43 4c 5f 45 52 essful or TCL_ER
3c10: 52 4f 52 20 69 66 20 66 61 69 6c 65 64 20 61 6c ROR if failed al
3c20: 6f 6e 67 20 77 69 74 68 20 61 6e 20 65 72 72 6f ong with an erro
3c30: 72 0a 20 2a 09 6d 65 73 73 61 67 65 20 69 6e 20 r. *.message in
3c40: 69 6e 74 65 72 70 20 61 6e 64 20 54 63 6c 5f 53 interp and Tcl_S
3c50: 65 74 45 72 72 6e 6f 2e 0a 20 2a 0a 20 2a 20 53 etErrno.. *. * S
3c60: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
3c70: 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 6f Sets result to o
3c80: 70 74 69 6f 6e 27 73 20 76 61 6c 75 65 0a 20 2a ption's value. *
3c90: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
3ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
3ce0: 61 74 69 63 20 69 6e 74 20 44 69 67 65 73 74 47 atic int DigestG
3cf0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c 69 etOptionProc(Cli
3d00: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
3d10: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
3d20: 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 interp, const ch
3d30: 61 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 0a ar *optionName,.
3d40: 09 54 63 6c 5f 44 53 74 72 69 6e 67 20 2a 6f 70 .Tcl_DString *op
3d50: 74 69 6f 6e 56 61 6c 75 65 29 20 7b 0a 20 20 20 tionValue) {.
3d60: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 DigestState *st
3d70: 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 atePtr = (Digest
3d80: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 State *) clientD
3d90: 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 ata;. Tcl_Cha
3da0: 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20 nnel parent;.
3db0: 20 54 63 6c 5f 44 72 69 76 65 72 47 65 74 4f 70 Tcl_DriverGetOp
3dc0: 74 69 6f 6e 50 72 6f 63 20 2a 67 65 74 4f 70 74 tionProc *getOpt
3dd0: 69 6f 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 2f 2a ionProc;.. /*
3de0: 20 41 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61 Abort if no cha
3df0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 nnel */. if (
3e00: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d statePtr->self =
3e10: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
3e20: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
3e30: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
3e40: 0a 0a 20 20 20 20 2f 2a 20 44 65 6c 65 67 61 74 .. /* Delegat
3e50: 65 20 6f 70 74 69 6f 6e 73 20 64 6f 77 6e 73 74 e options downst
3e60: 72 65 61 6d 20 2a 2f 0a 20 20 20 20 70 61 72 65 ream */. pare
3e70: 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 nt = Tcl_GetStac
3e80: 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 kedChannel(state
3e90: 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 Ptr->self);.
3ea0: 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 getOptionProc =
3eb0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 47 65 74 4f 70 Tcl_ChannelGetOp
3ec0: 74 69 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74 tionProc(Tcl_Get
3ed0: 43 68 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 ChannelType(pare
3ee0: 6e 74 29 29 3b 0a 20 20 20 20 69 66 20 28 67 65 nt));. if (ge
3ef0: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e tOptionProc != N
3f00: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28 ULL) {..return (
3f10: 2a 67 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28 *getOptionProc)(
3f20: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e Tcl_GetChannelIn
3f30: 73 74 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e stanceData(paren
3f40: 74 29 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69 t), interp, opti
3f50: 6f 6e 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 onName, optionVa
3f60: 6c 75 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 lue);. } else
3f70: 20 69 66 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 20 if (optionName
3f80: 3d 3d 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c 29 == (char*) NULL)
3f90: 20 7b 0a 09 2f 2a 20 52 65 71 75 65 73 74 20 69 {../* Request i
3fa0: 73 20 71 75 65 72 79 20 66 6f 72 20 61 6c 6c 20 s query for all
3fb0: 6f 70 74 69 6f 6e 73 2c 20 74 68 69 73 20 69 73 options, this is
3fc0: 20 6f 6b 2e 20 2a 2f 0a 09 72 65 74 75 72 6e 20 ok. */..return
3fd0: 54 43 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c TCL_OK;. } el
3fe0: 73 65 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 se {..Tcl_SetErr
3ff0: 6e 6f 28 45 49 4e 56 41 4c 29 3b 0a 09 72 65 74 no(EINVAL);..ret
4000: 75 72 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e urn Tcl_BadChann
4010: 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c elOption(interp,
4020: 20 6f 70 74 69 6f 6e 4e 61 6d 65 2c 20 4e 55 4c optionName, NUL
4030: 4c 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a L);. }.}../*.
4040: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
4050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4080: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 --------. *. * D
4090: 69 67 65 73 74 54 69 6d 65 72 48 61 6e 64 6c 65 igestTimerHandle
40a0: 72 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 r --. *. *.Calle
40b0: 64 20 62 79 20 74 68 65 20 6e 6f 74 69 66 69 65 d by the notifie
40c0: 72 20 76 69 61 20 74 69 6d 65 72 20 74 6f 20 66 r via timer to f
40d0: 6c 75 73 68 20 6f 75 74 20 70 65 6e 64 69 6e 67 lush out pending
40e0: 20 69 6e 70 75 74 20 64 61 74 61 2e 0a 20 2a 0a input data.. *.
40f0: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e * Returns:. *.N
4100: 6f 74 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 othing. *. * Sid
4110: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 e effects:. *.Ma
4120: 79 20 63 61 6c 6c 20 54 63 6c 5f 4e 6f 74 69 66 y call Tcl_Notif
4130: 79 43 68 61 6e 6e 65 6c 0a 20 2a 0a 20 2a 2d 2d yChannel. *. *--
4140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4180: 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 ----. */.static
4190: 76 6f 69 64 20 44 69 67 65 73 74 54 69 6d 65 72 void DigestTimer
41a0: 48 61 6e 64 6c 65 72 28 43 6c 69 65 6e 74 44 61 Handler(ClientDa
41b0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 29 20 7b ta clientData) {
41c0: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 . DigestState
41d0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 *statePtr = (Di
41e0: 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 gestState *) cli
41f0: 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a entData;.. /*
4200: 20 41 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61 Abort if no cha
4210: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 nnel */. if (
4220: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d statePtr->self =
4230: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
4240: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b NULL) {..return;
4250: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
4260: 6c 65 61 72 20 74 69 6d 65 72 20 74 6f 6b 65 6e lear timer token
4270: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 */. statePtr
4280: 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 ->timer = (Tcl_T
4290: 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b imerToken) NULL;
42a0: 0a 0a 20 20 20 20 2f 2a 20 46 69 72 65 20 65 76 .. /* Fire ev
42b0: 65 6e 74 20 69 66 20 74 68 65 72 65 20 69 73 20 ent if there is
42c0: 70 65 6e 64 69 6e 67 20 64 61 74 61 2c 20 73 6b pending data, sk
42d0: 69 70 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a ip otherwise */.
42e0: 20 20 20 20 69 66 20 28 28 73 74 61 74 65 50 74 if ((statePt
42f0: 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 26 20 54 r->watchMask & T
4300: 43 4c 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20 CL_READABLE) &&
4310: 28 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 (Tcl_InputBuffer
4320: 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c ed(statePtr->sel
4330: 66 29 20 3e 20 30 29 29 20 7b 0a 09 54 63 6c 5f f) > 0)) {..Tcl_
4340: 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c 28 73 74 NotifyChannel(st
4350: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 54 43 atePtr->self, TC
4360: 4c 5f 52 45 41 44 41 42 4c 45 29 3b 0a 20 20 20 L_READABLE);.
4370: 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 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: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 57 61 -. *. * DigestWa
43d0: 74 63 68 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a tchProc --. *. *
43e0: 09 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 .Initialize the
43f0: 6e 6f 74 69 66 69 65 72 20 74 6f 20 77 61 74 63 notifier to watc
4400: 68 20 66 6f 72 20 65 76 65 6e 74 73 20 66 72 6f h for events fro
4410: 6d 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 2e 0a m this channel..
4420: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 *. * Returns:.
4430: 2a 09 4e 6f 74 68 69 6e 67 20 28 63 61 6e 27 74 *.Nothing (can't
4440: 20 72 65 74 75 72 6e 20 65 72 72 6f 72 20 6d 65 return error me
4450: 73 73 61 67 65 73 29 0a 20 2a 0a 20 2a 20 53 69 ssages). *. * Si
4460: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
4470: 6f 6e 66 69 67 75 72 65 20 6e 6f 74 69 66 69 65 onfigure notifie
4480: 72 20 73 6f 20 66 75 74 75 72 65 20 65 76 65 6e r so future even
4490: 74 73 20 6f 6e 20 74 68 65 20 63 68 61 6e 6e 65 ts on the channe
44a0: 6c 20 77 69 6c 6c 20 62 65 20 73 65 65 6e 20 62 l will be seen b
44b0: 79 20 54 63 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d y Tcl.. *. *----
44c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
44d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
44e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
44f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4500: 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 44 69 67 65 --. */.void Dige
4510: 73 74 57 61 74 63 68 50 72 6f 63 28 43 6c 69 65 stWatchProc(Clie
4520: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
4530: 61 2c 20 69 6e 74 20 6d 61 73 6b 29 20 7b 0a 20 a, int mask) {.
4540: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a DigestState *
4550: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 statePtr = (Dige
4560: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e stState *) clien
4570: 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f 43 tData;. Tcl_C
4580: 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a 20 hannel parent;.
4590: 20 20 20 54 63 6c 5f 44 72 69 76 65 72 57 61 74 Tcl_DriverWat
45a0: 63 68 50 72 6f 63 20 2a 77 61 74 63 68 50 72 6f chProc *watchPro
45b0: 63 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 c;.. /* Abort
45c0: 20 69 66 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a if no channel *
45d0: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 /. if (stateP
45e0: 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c tr->self == (Tcl
45f0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
4600: 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d {..return;. }
4610: 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 4f .. /* Store O
4620: 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e R-ed combination
4630: 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 of TCL_READABLE
4640: 2c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 61 , TCL_WRITABLE a
4650: 6e 64 20 54 43 4c 5f 45 58 43 45 50 54 49 4f 4e nd TCL_EXCEPTION
4660: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 */. statePtr
4670: 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 6d 61 ->watchMask = ma
4680: 73 6b 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f 70 sk;.. /* Prop
4690: 61 67 61 74 65 20 6d 61 73 6b 20 69 6e 66 6f 20 agate mask info
46a0: 74 6f 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 to parent channe
46b0: 6c 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 20 l */. parent
46c0: 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 = Tcl_GetStacked
46d0: 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 Channel(statePtr
46e0: 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 77 61 74 ->self);. wat
46f0: 63 68 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 61 chProc = Tcl_Cha
4700: 6e 6e 65 6c 57 61 74 63 68 50 72 6f 63 28 54 63 nnelWatchProc(Tc
4710: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
4720: 28 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 77 (parent));. w
4730: 61 74 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74 atchProc(Tcl_Get
4740: 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 44 ChannelInstanceD
4750: 61 74 61 28 70 61 72 65 6e 74 29 2c 20 6d 61 73 ata(parent), mas
4760: 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d 6f k);.. /* Remo
4770: 76 65 20 70 65 6e 64 69 6e 67 20 74 69 6d 65 72 ve pending timer
4780: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 */. if (stat
4790: 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 ePtr->timer != (
47a0: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 Tcl_TimerToken)
47b0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c NULL) {..Tcl_Del
47c0: 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 eteTimerHandler(
47d0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 statePtr->timer)
47e0: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d ;..statePtr->tim
47f0: 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 er = (Tcl_TimerT
4800: 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 oken) NULL;.
4810: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 }.. /* If the
4820: 72 65 20 69 73 20 64 61 74 61 20 70 65 6e 64 69 re is data pendi
4830: 6e 67 2c 20 73 65 74 20 6e 65 77 20 74 69 6d 65 ng, set new time
4840: 72 20 74 6f 20 63 61 6c 6c 20 54 63 6c 5f 4e 6f r to call Tcl_No
4850: 74 69 66 79 43 68 61 6e 6e 65 6c 20 2a 2f 0a 20 tifyChannel */.
4860: 20 20 20 69 66 20 28 28 6d 61 73 6b 20 26 20 54 if ((mask & T
4870: 43 4c 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20 CL_READABLE) &&
4880: 28 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 (Tcl_InputBuffer
4890: 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c ed(statePtr->sel
48a0: 66 29 20 3e 20 30 29 29 20 7b 0a 09 73 74 61 74 f) > 0)) {..stat
48b0: 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 54 63 ePtr->timer = Tc
48c0: 6c 5f 43 72 65 61 74 65 54 69 6d 65 72 48 61 6e l_CreateTimerHan
48d0: 64 6c 65 72 28 52 45 41 44 5f 44 45 4c 41 59 2c dler(READ_DELAY,
48e0: 20 44 69 67 65 73 74 54 69 6d 65 72 48 61 6e 64 DigestTimerHand
48f0: 6c 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 ler, (ClientData
4900: 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 ) statePtr);.
4910: 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d }.}../*. *-----
4920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4960: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 47 65 -. *. * DigestGe
4970: 74 48 61 6e 64 6c 65 50 72 6f 63 20 2d 2d 0a 20 tHandleProc --.
4980: 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 66 72 6f 6d *. *.Called from
4990: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 48 Tcl_GetChannelH
49a0: 61 6e 64 6c 65 20 74 6f 20 72 65 74 72 69 65 76 andle to retriev
49b0: 65 20 4f 53 20 73 70 65 63 69 66 69 63 20 66 69 e OS specific fi
49c0: 6c 65 20 68 61 6e 64 6c 65 0a 20 2a 09 66 72 6f le handle. *.fro
49d0: 6d 20 69 6e 73 69 64 65 20 74 68 69 73 20 63 68 m inside this ch
49e0: 61 6e 6e 65 6c 2e 20 4e 6f 74 20 75 73 65 64 20 annel. Not used
49f0: 66 6f 72 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 for transformati
4a00: 6f 6e 73 3f 0a 20 2a 0a 20 2a 20 52 65 74 75 72 ons?. *. * Retur
4a10: 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 66 6f ns:. *.TCL_OK fo
4a20: 72 20 73 75 63 63 65 73 73 20 6f 72 20 54 43 4c r success or TCL
4a30: 5f 45 52 52 4f 52 20 66 6f 72 20 65 72 72 6f 72 _ERROR for error
4a40: 20 6f 72 20 69 66 20 6e 6f 74 20 73 75 70 70 6f or if not suppo
4a50: 72 74 65 64 2e 20 49 66 0a 20 2a 09 64 69 72 65 rted. If. *.dire
4a60: 63 74 69 6f 6e 20 69 73 20 54 43 4c 5f 52 45 41 ction is TCL_REA
4a70: 44 41 42 4c 45 2c 20 73 65 74 73 20 68 61 6e 64 DABLE, sets hand
4a80: 6c 65 50 74 72 20 74 6f 20 74 68 65 20 68 61 6e lePtr to the han
4a90: 64 6c 65 20 75 73 65 64 20 66 6f 72 0a 20 2a 09 dle used for. *.
4aa0: 69 6e 70 75 74 2c 20 6f 72 20 69 66 20 54 43 4c input, or if TCL
4ab0: 5f 57 52 49 54 41 42 4c 45 20 73 65 74 73 20 74 _WRITABLE sets t
4ac0: 6f 20 74 68 65 20 68 61 6e 64 6c 65 20 75 73 65 o the handle use
4ad0: 64 20 66 6f 72 20 6f 75 74 70 75 74 2e 0a 20 2a d for output.. *
4ae0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
4af0: 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d :. *.None. *. *-
4b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4b40: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 -----. */.int Di
4b50: 67 65 73 74 47 65 74 48 61 6e 64 6c 65 50 72 6f gestGetHandlePro
4b60: 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 c(ClientData cli
4b70: 65 6e 74 44 61 74 61 2c 20 69 6e 74 20 64 69 72 entData, int dir
4b80: 65 63 74 69 6f 6e 2c 20 43 6c 69 65 6e 74 44 61 ection, ClientDa
4b90: 74 61 20 2a 68 61 6e 64 6c 65 50 74 72 29 20 7b ta *handlePtr) {
4ba0: 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 . DigestState
4bb0: 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 *statePtr = (Di
4bc0: 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 gestState *) cli
4bd0: 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c entData;. Tcl
4be0: 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b _Channel parent;
4bf0: 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 .. /* Abort i
4c00: 66 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a f no channel */.
4c10: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
4c20: 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 ->self == (Tcl_C
4c30: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
4c40: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
4c50: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 61 R;. }.. pa
4c60: 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 rent = Tcl_GetSt
4c70: 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 61 ackedChannel(sta
4c80: 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 tePtr->self);.
4c90: 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 47 65 74 return Tcl_Get
4ca0: 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 28 70 61 ChannelHandle(pa
4cb0: 72 65 6e 74 2c 20 64 69 72 65 63 74 69 6f 6e 2c rent, direction,
4cc0: 20 68 61 6e 64 6c 65 50 74 72 29 3b 0a 7d 0a 0a handlePtr);.}..
4cd0: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. *-----------
4ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
4d20: 2a 20 44 69 67 65 73 74 4e 6f 74 69 66 79 50 72 * DigestNotifyPr
4d30: 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c oc --. *. *.Call
4d40: 65 64 20 62 79 20 54 63 6c 20 74 6f 20 69 6e 66 ed by Tcl to inf
4d50: 6f 72 6d 20 75 73 20 6f 66 20 61 63 74 69 76 69 orm us of activi
4d60: 74 79 20 6f 6e 20 74 68 65 20 75 6e 64 65 72 6c ty on the underl
4d70: 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a ying channel.. *
4d80: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 . * Returns:. *.
4d90: 55 6e 63 68 61 6e 67 65 64 20 69 6e 74 65 72 65 Unchanged intere
4da0: 73 74 4d 61 73 6b 20 77 68 69 63 68 20 69 73 20 stMask which is
4db0: 61 6e 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 an OR-ed combina
4dc0: 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 tion of TCL_READ
4dd0: 41 42 4c 45 20 6f 72 20 54 43 4c 5f 57 52 49 54 ABLE or TCL_WRIT
4de0: 41 42 4c 45 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ABLE. *. * Side
4df0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6e 63 effects:. *.Canc
4e00: 65 6c 73 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 els any pending
4e10: 74 69 6d 65 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d timer.. *. *----
4e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
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 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 --. */.int Diges
4e70: 74 4e 6f 74 69 66 79 50 72 6f 63 28 43 6c 69 65 tNotifyProc(Clie
4e80: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
4e90: 61 2c 20 69 6e 74 20 69 6e 74 65 72 65 73 74 4d a, int interestM
4ea0: 61 73 6b 29 20 7b 0a 20 20 20 20 44 69 67 65 73 ask) {. Diges
4eb0: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 tState *statePtr
4ec0: 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 = (DigestState
4ed0: 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a *) clientData;..
4ee0: 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 69 6d 65 /* Skip time
4ef0: 72 20 65 76 65 6e 74 20 61 73 20 72 65 64 75 6e r event as redun
4f00: 64 61 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 dant */. if (
4f10: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 statePtr->timer
4f20: 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b != (Tcl_TimerTok
4f30: 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c en) NULL) {..Tcl
4f40: 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 _DeleteTimerHand
4f50: 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 69 ler(statePtr->ti
4f60: 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 2d mer);..statePtr-
4f70: 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 >timer = (Tcl_Ti
4f80: 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a merToken) NULL;.
4f90: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
4fa0: 20 69 6e 74 65 72 65 73 74 4d 61 73 6b 3b 0a 7d interestMask;.}
4fb0: 0a 0a 2f 2a 0a 20 2a 0a 20 2a 20 43 68 61 6e 6e ../*. *. * Chann
4fc0: 65 6c 20 74 79 70 65 20 73 74 72 75 63 74 75 72 el type structur
4fd0: 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 e definition for
4fe0: 20 64 69 67 65 73 74 20 74 72 61 6e 73 66 6f 72 digest transfor
4ff0: 6d 61 74 69 6f 6e 73 2e 0a 20 2a 0a 20 2a 2f 0a mations.. *. */.
5000: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54 63 6c static const Tcl
5010: 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 64 69 67 _ChannelType dig
5020: 65 73 74 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d estChannelType =
5030: 20 7b 0a 20 20 20 20 22 64 69 67 65 73 74 22 2c {. "digest",
5040: 09 09 09 2f 2a 20 54 79 70 65 20 6e 61 6d 65 20 .../* Type name
5050: 2a 2f 0a 20 20 20 20 54 43 4c 5f 43 48 41 4e 4e */. TCL_CHANN
5060: 45 4c 5f 56 45 52 53 49 4f 4e 5f 35 2c 09 2f 2a EL_VERSION_5,./*
5070: 20 76 35 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 v5 channel */.
5080: 20 20 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 DigestClosePr
5090: 6f 63 2c 09 09 2f 2a 20 43 6c 6f 73 65 20 70 72 oc,../* Close pr
50a0: 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 oc */. Digest
50b0: 49 6e 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20 49 InputProc,../* I
50c0: 6e 70 75 74 20 70 72 6f 63 20 2a 2f 0a 20 20 20 nput proc */.
50d0: 20 44 69 67 65 73 74 4f 75 74 70 75 74 50 72 6f DigestOutputPro
50e0: 63 2c 09 09 2f 2a 20 4f 75 74 70 75 74 20 70 72 c,../* Output pr
50f0: 6f 63 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 oc */. NULL,.
5100: 09 09 2f 2a 20 53 65 65 6b 20 70 72 6f 63 20 2a ../* Seek proc *
5110: 2f 0a 20 20 20 20 44 69 67 65 73 74 53 65 74 4f /. DigestSetO
5120: 70 74 69 6f 6e 50 72 6f 63 2c 09 2f 2a 20 53 65 ptionProc,./* Se
5130: 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f t option proc */
5140: 0a 20 20 20 20 44 69 67 65 73 74 47 65 74 4f 70 . DigestGetOp
5150: 74 69 6f 6e 50 72 6f 63 2c 09 2f 2a 20 47 65 74 tionProc,./* Get
5160: 20 6f 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a option proc */.
5170: 20 20 20 20 44 69 67 65 73 74 57 61 74 63 68 50 DigestWatchP
5180: 72 6f 63 2c 09 09 2f 2a 20 49 6e 69 74 69 61 6c roc,../* Initial
5190: 69 7a 65 20 6e 6f 74 69 66 69 65 72 20 2a 2f 0a ize notifier */.
51a0: 20 20 20 20 44 69 67 65 73 74 47 65 74 48 61 6e DigestGetHan
51b0: 64 6c 65 50 72 6f 63 2c 09 2f 2a 20 47 65 74 20 dleProc,./* Get
51c0: 4f 53 20 68 61 6e 64 6c 65 73 20 6f 75 74 20 6f OS handles out o
51d0: 66 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 f channel */.
51e0: 20 44 69 67 65 73 74 43 6c 6f 73 65 32 50 72 6f DigestClose2Pro
51f0: 63 2c 09 09 2f 2a 20 63 6c 6f 73 65 32 70 72 6f c,../* close2pro
5200: 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 42 c */. DigestB
5210: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 2c 09 2f 2a lockModeProc,./*
5220: 20 53 65 74 20 62 6c 6f 63 6b 69 6e 67 2f 6e 6f Set blocking/no
5230: 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2a 2f nblocking mode*/
5240: 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 . NULL,.../*
5250: 46 6c 75 73 68 20 70 72 6f 63 20 2a 2f 0a 20 20 Flush proc */.
5260: 20 20 44 69 67 65 73 74 4e 6f 74 69 66 79 50 72 DigestNotifyPr
5270: 6f 63 2c 09 09 2f 2a 20 48 61 6e 64 6c 69 6e 67 oc,../* Handling
5280: 20 6f 66 20 65 76 65 6e 74 73 20 62 75 62 62 6c of events bubbl
5290: 69 6e 67 20 75 70 20 2a 2f 0a 20 20 20 20 4e 55 ing up */. NU
52a0: 4c 4c 2c 09 09 09 2f 2a 20 57 69 64 65 20 73 65 LL,.../* Wide se
52b0: 65 6b 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 4e ek proc */. N
52c0: 55 4c 4c 2c 09 09 09 2f 2a 20 54 68 72 65 61 64 ULL,.../* Thread
52d0: 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 4e action */. N
52e0: 55 4c 4c 09 09 09 2f 2a 20 54 72 75 6e 63 61 74 ULL.../* Truncat
52f0: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d e */.};../*. *--
5300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5340: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 ----. *. * Diges
5350: 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 20 tChannelHandler
5360: 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65 20 --. *. *.Create
5370: 61 20 73 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 a stacked channe
5380: 6c 20 66 6f 72 20 61 20 6d 65 73 73 61 67 65 20 l for a message
5390: 64 69 67 65 73 74 20 74 72 61 6e 73 66 6f 72 6d digest transform
53a0: 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 ation.. *. * Ret
53b0: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 urns:. *.TCL_OK
53c0: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a or TCL_ERROR. *.
53d0: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
53e0: 0a 20 2a 09 41 64 64 73 20 74 72 61 6e 73 66 6f . *.Adds transfo
53f0: 72 6d 20 74 6f 20 63 68 61 6e 6e 65 6c 20 61 6e rm to channel an
5400: 64 20 73 65 74 73 20 72 65 73 75 6c 74 20 74 6f d sets result to
5410: 20 63 68 61 6e 6e 65 6c 20 69 64 20 6f 72 20 65 channel id or e
5420: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a rror message.. *
5430: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
5440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
5480: 61 74 69 63 20 69 6e 74 20 44 69 67 65 73 74 43 atic int DigestC
5490: 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 72 28 54 63 hannelHandler(Tc
54a0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
54b0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 68 , const char *ch
54c0: 61 6e 6e 65 6c 2c 20 54 63 6c 5f 4f 62 6a 20 2a annel, Tcl_Obj *
54d0: 64 69 67 65 73 74 4f 62 6a 2c 0a 09 54 63 6c 5f digestObj,..Tcl_
54e0: 4f 62 6a 20 2a 63 69 70 68 65 72 4f 62 6a 2c 20 Obj *cipherObj,
54f0: 69 6e 74 20 66 6f 72 6d 61 74 2c 20 54 63 6c 5f int format, Tcl_
5500: 4f 62 6a 20 2a 6b 65 79 4f 62 6a 2c 20 54 63 6c Obj *keyObj, Tcl
5510: 5f 4f 62 6a 20 2a 6d 61 63 4f 62 6a 29 20 7b 0a _Obj *macObj) {.
5520: 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 20 2f 2a int mode; /*
5530: 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 OR-ed combinati
5540: 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 on of TCL_READAB
5550: 4c 45 20 61 6e 64 20 54 43 4c 5f 57 52 49 54 41 LE and TCL_WRITA
5560: 42 4c 45 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 43 BLE */. Tcl_C
5570: 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 hannel chan;.
5580: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 DigestState *st
5590: 61 74 65 50 74 72 3b 0a 0a 20 20 20 20 64 70 72 atePtr;.. dpr
55a0: 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a intf("Called");.
55b0: 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 . /* Validate
55c0: 20 61 72 67 73 20 2a 2f 0a 20 20 20 20 69 66 20 args */. if
55d0: 28 63 68 61 6e 6e 65 6c 20 3d 3d 20 28 63 6f 6e (channel == (con
55e0: 73 74 20 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 st char *) NULL)
55f0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
5600: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f sult(interp, "No
5610: 20 63 68 61 6e 6e 65 6c 22 2c 20 28 63 68 61 72 channel", (char
5620: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
5630: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
5640: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 }.. /* Get
5650: 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 channel Id */.
5660: 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 chan = Tcl_Get
5670: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 Channel(interp,
5680: 63 68 61 6e 6e 65 6c 2c 20 26 6d 6f 64 65 29 3b channel, &mode);
5690: 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d . if (chan ==
56a0: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
56b0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
56c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
56d0: 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 . /* Make sur
56e0: 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 e to operate on
56f0: 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e the topmost chan
5700: 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 nel */. chan
5710: 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e = Tcl_GetTopChan
5720: 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 nel(chan);..
5730: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 20 63 68 61 /* Configure cha
5740: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 54 63 6c 5f nnel */. Tcl_
5750: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e SetChannelOption
5760: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 (interp, chan, "
5770: 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 -translation", "
5780: 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 69 66 binary");. if
5790: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
57a0: 42 75 66 66 65 72 53 69 7a 65 28 63 68 61 6e 29 BufferSize(chan)
57b0: 20 3c 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 < EVP_MAX_MD_SI
57c0: 5a 45 20 2a 20 32 29 20 7b 0a 09 54 63 6c 5f 53 ZE * 2) {..Tcl_S
57d0: 65 74 43 68 61 6e 6e 65 6c 42 75 66 66 65 72 53 etChannelBufferS
57e0: 69 7a 65 28 63 68 61 6e 2c 20 45 56 50 5f 4d 41 ize(chan, EVP_MA
57f0: 58 5f 4d 44 5f 53 49 5a 45 20 2a 20 32 29 3b 0a X_MD_SIZE * 2);.
5800: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 }.. /* Cr
5810: 65 61 74 65 20 73 74 61 74 65 20 64 61 74 61 20 eate state data
5820: 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 structure */.
5830: 20 69 66 20 28 28 73 74 61 74 65 50 74 72 20 3d if ((statePtr =
5840: 20 44 69 67 65 73 74 53 74 61 74 65 4e 65 77 28 DigestStateNew(
5850: 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74 29 29 interp, format))
5860: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c == NULL) {..Tcl
5870: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
5880: 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20 61 6c terp, "Memory al
5890: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c location error",
58a0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b (char *) NULL);
58b0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
58c0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 OR;. }. st
58d0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 63 atePtr->self = c
58e0: 68 61 6e 3b 0a 20 20 20 20 73 74 61 74 65 50 74 han;. statePt
58f0: 72 2d 3e 6d 6f 64 65 20 3d 20 6d 6f 64 65 3b 0a r->mode = mode;.
5900: 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 . /* Initiali
5910: 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e ze hash function
5920: 20 2a 2f 0a 20 20 20 20 69 66 20 28 44 69 67 65 */. if (Dige
5930: 73 74 49 6e 69 74 69 61 6c 69 7a 65 28 69 6e 74 stInitialize(int
5940: 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 64 erp, statePtr, d
5950: 69 67 65 73 74 4f 62 6a 2c 20 63 69 70 68 65 72 igestObj, cipher
5960: 4f 62 6a 2c 20 6b 65 79 4f 62 6a 2c 20 6d 61 63 Obj, keyObj, mac
5970: 4f 62 6a 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 Obj) != TCL_OK)
5980: 7b 0a 09 44 69 67 65 73 74 53 74 61 74 65 46 72 {..DigestStateFr
5990: 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a 09 72 ee(statePtr);..r
59a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
59b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 . }.. /* S
59c0: 74 61 63 6b 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a tack channel */.
59d0: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 statePtr->se
59e0: 6c 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 lf = Tcl_StackCh
59f0: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 26 64 annel(interp, &d
5a00: 69 67 65 73 74 43 68 61 6e 6e 65 6c 54 79 70 65 igestChannelType
5a10: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 , (ClientData) s
5a20: 74 61 74 65 50 74 72 2c 20 6d 6f 64 65 2c 20 63 tatePtr, mode, c
5a30: 68 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 73 74 han);. if (st
5a40: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 atePtr->self ==
5a50: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
5a60: 4c 4c 29 20 7b 0a 09 44 69 67 65 73 74 53 74 61 LL) {..DigestSta
5a70: 74 65 46 72 65 65 28 73 74 61 74 65 50 74 72 29 teFree(statePtr)
5a80: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
5a90: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
5aa0: 2f 2a 20 53 65 74 20 72 65 73 75 6c 74 20 74 6f /* Set result to
5ab0: 20 63 68 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 channel Id */.
5ac0: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 Tcl_SetResult
5ad0: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a (interp, (char *
5ae0: 29 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c ) Tcl_GetChannel
5af0: 4e 61 6d 65 28 63 68 61 6e 29 2c 20 54 43 4c 5f Name(chan), TCL_
5b00: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 VOLATILE);. r
5b10: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
5b20: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
5b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
5b70: 20 2a 20 55 6e 73 74 61 63 6b 20 43 68 61 6e 6e * Unstack Chann
5b80: 65 6c 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 el --. *. *.This
5b90: 20 66 75 6e 63 74 69 6f 6e 20 72 65 6d 6f 76 65 function remove
5ba0: 73 20 74 68 65 20 73 74 61 63 6b 65 64 20 63 68 s the stacked ch
5bb0: 61 6e 6e 65 6c 20 66 72 6f 6d 20 74 68 65 20 74 annel from the t
5bc0: 6f 70 20 6f 66 20 74 68 65 0a 20 2a 09 63 68 61 op of the. *.cha
5bd0: 6e 6e 65 6c 20 73 74 61 63 6b 20 69 66 20 69 74 nnel stack if it
5be0: 20 69 73 20 61 20 64 69 67 65 73 74 20 63 68 61 is a digest cha
5bf0: 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 nnel.. *. * Retu
5c00: 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f rns:. *.TCL_OK o
5c10: 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 r TCL_ERROR. *.
5c20: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
5c30: 20 2a 09 52 65 6d 6f 76 65 73 20 74 72 61 6e 73 *.Removes trans
5c40: 66 6f 72 6d 20 66 72 6f 6d 20 63 68 61 6e 6e 65 form from channe
5c50: 6c 20 6f 72 20 73 65 74 73 20 72 65 73 75 6c 74 l or sets result
5c60: 20 74 6f 20 65 72 72 6f 72 20 6d 65 73 73 61 67 to error messag
5c70: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d e.. *. *--------
5c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
5cc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 44 69 */.static int Di
5cd0: 67 65 73 74 55 6e 73 74 61 63 6b 4f 62 6a 43 6d gestUnstackObjCm
5ce0: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
5cf0: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
5d00: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
5d10: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
5d20: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
5d30: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 Tcl_Channel
5d40: 63 68 61 6e 3b 0a 20 20 20 20 69 6e 74 20 6d 6f chan;. int mo
5d50: 64 65 3b 20 2f 2a 20 4f 52 2d 65 64 20 63 6f 6d de; /* OR-ed com
5d60: 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f bination of TCL_
5d70: 52 45 41 44 41 42 4c 45 20 61 6e 64 20 54 43 4c READABLE and TCL
5d80: 5f 57 52 49 54 41 42 4c 45 20 20 2a 2f 0a 0a 20 _WRITABLE */..
5d90: 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c dprintf("Call
5da0: 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 ed");.. /* Va
5db0: 6c 69 64 61 74 65 20 61 72 67 20 63 6f 75 6e 74 lidate arg count
5dc0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 */. if (objc
5dd0: 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 != 2) {..Tcl_Wr
5de0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
5df0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 p, 1, objv, "cha
5e00: 6e 6e 65 6c 49 64 22 29 3b 0a 09 72 65 74 75 72 nnelId");..retur
5e10: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
5e20: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 }.. /* Get c
5e30: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 hannel */. ch
5e40: 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e an = Tcl_GetChan
5e50: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f nel(interp, Tcl_
5e60: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a GetStringFromObj
5e70: 28 6f 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c (objv[1], NULL),
5e80: 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 &mode);. if
5e90: 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 (chan == (Tcl_Ch
5ea0: 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 annel) NULL) {..
5eb0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
5ec0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
5ed0: 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 Make sure to ope
5ee0: 72 61 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d rate on the topm
5ef0: 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 ost channel */.
5f00: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 chan = Tcl_Ge
5f10: 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e tTopChannel(chan
5f20: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b );.. /* Check
5f30: 20 69 66 20 64 69 67 65 73 74 20 63 68 61 6e 6e if digest chann
5f40: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 el */. if (Tc
5f50: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 l_GetChannelType
5f60: 28 63 68 61 6e 29 20 21 3d 20 26 64 69 67 65 73 (chan) != &diges
5f70: 74 43 68 61 6e 6e 65 6c 54 79 70 65 29 20 7b 0a tChannelType) {.
5f80: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
5f90: 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 t(interp, "bad c
5fa0: 68 61 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f hannel \"", Tcl_
5fb0: 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 GetChannelName(c
5fc0: 68 61 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 han),.. "\":
5fd0: 6e 6f 74 20 61 20 64 69 67 65 73 74 20 63 68 61 not a digest cha
5fe0: 6e 6e 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 nnel", NULL);..T
5ff0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
6000: 69 6e 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 interp, "TLS", "
6010: 55 4e 53 54 41 43 4b 22 2c 20 22 43 48 41 4e 4e UNSTACK", "CHANN
6020: 45 4c 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 EL", "INVALID",
6030: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
6040: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
6050: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
6060: 20 50 6f 70 20 74 72 61 6e 73 66 6f 72 6d 20 66 Pop transform f
6070: 72 6f 6d 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 rom channel */.
6080: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 55 6e return Tcl_Un
6090: 73 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 stackChannel(int
60a0: 65 72 70 2c 20 63 68 61 6e 29 3b 0a 20 20 20 20 erp, chan);.
60b0: 09 63 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c .clientData = cl
60c0: 69 65 6e 74 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 2a ientData;.}../**
60d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
60e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
60f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6110: 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d */../*. *-------
6120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
6160: 20 2a 20 44 69 67 65 73 74 49 6e 73 74 61 6e 63 * DigestInstanc
6170: 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a eObjCmd --. *. *
6180: 09 48 61 6e 64 6c 65 72 20 66 6f 72 20 64 69 67 .Handler for dig
6190: 65 73 74 20 63 6f 6d 6d 61 6e 64 20 69 6e 73 74 est command inst
61a0: 61 6e 63 65 73 2e 20 55 73 65 64 20 74 6f 20 61 ances. Used to a
61b0: 64 64 20 64 61 74 61 20 74 6f 20 68 61 73 68 0a dd data to hash.
61c0: 20 2a 09 66 75 6e 63 74 69 6f 6e 20 6f 72 20 72 *.function or r
61d0: 65 74 72 69 65 76 65 20 6d 65 73 73 61 67 65 20 etrieve message
61e0: 64 69 67 65 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 digest.. *. * Re
61f0: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b turns:. *.TCL_OK
6200: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a or TCL_ERROR. *
6210: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
6220: 3a 0a 20 2a 09 41 64 64 73 20 64 61 74 61 20 74 :. *.Adds data t
6230: 6f 20 68 61 73 68 20 6f 72 20 72 65 74 75 72 6e o hash or return
6240: 73 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 s message digest
6250: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
6260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e ---------. */.in
62a0: 74 20 44 69 67 65 73 74 49 6e 73 74 61 6e 63 65 t DigestInstance
62b0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
62c0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
62d0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
62e0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
62f0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
6300: 5d 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 ]) {. DigestS
6310: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
6320: 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 (DigestState *)
6330: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 clientData;.
6340: 20 69 6e 74 20 66 6e 2c 20 64 61 74 61 5f 6c 65 int fn, data_le
6350: 6e 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 n = 0;. char
6360: 2a 64 61 74 61 20 3d 20 4e 55 4c 4c 3b 0a 20 20 *data = NULL;.
6370: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 static const c
6380: 68 61 72 20 2a 69 6e 73 74 61 6e 63 65 5f 66 6e har *instance_fn
6390: 73 20 5b 5d 20 3d 20 7b 20 22 66 69 6e 61 6c 69 s [] = { "finali
63a0: 7a 65 22 2c 20 22 75 70 64 61 74 65 22 2c 20 4e ze", "update", N
63b0: 55 4c 4c 20 7d 3b 0a 0a 20 20 20 20 64 70 72 69 ULL };.. dpri
63c0: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
63d0: 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 /* Validate
63e0: 61 72 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 arg count */.
63f0: 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 20 7c 7c if (objc < 2 ||
6400: 20 6f 62 6a 63 20 3e 20 33 29 20 7b 0a 09 54 63 objc > 3) {..Tc
6410: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
6420: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 nterp, 1, objv,
6430: 22 66 75 6e 63 74 69 6f 6e 20 3f 64 61 74 61 3f "function ?data?
6440: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
6450: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
6460: 20 20 2f 2a 20 47 65 74 20 66 75 6e 63 74 69 6f /* Get functio
6470: 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c n */. if (Tcl
6480: 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a _GetIndexFromObj
6490: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d (interp, objv[1]
64a0: 2c 20 69 6e 73 74 61 6e 63 65 5f 66 6e 73 2c 20 , instance_fns,
64b0: 22 66 75 6e 63 74 69 6f 6e 22 2c 20 30 2c 20 26 "function", 0, &
64c0: 66 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b fn) != TCL_OK) {
64d0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
64e0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
64f0: 2a 20 44 6f 20 66 75 6e 63 74 69 6f 6e 20 2a 2f * Do function */
6500: 0a 20 20 20 20 69 66 20 28 66 6e 29 20 7b 0a 09 . if (fn) {..
6510: 2f 2a 20 47 65 74 20 64 61 74 61 20 6f 72 20 72 /* Get data or r
6520: 65 74 75 72 6e 20 65 72 72 6f 72 20 69 66 20 6e eturn error if n
6530: 6f 6e 65 20 2a 2f 0a 09 69 66 20 28 6f 62 6a 63 one */..if (objc
6540: 20 3d 3d 20 33 29 20 7b 0a 09 20 20 20 20 64 61 == 3) {.. da
6550: 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 ta = Tcl_GetByte
6560: 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a ArrayFromObj(obj
6570: 76 5b 32 5d 2c 20 26 64 61 74 61 5f 6c 65 6e 29 v[2], &data_len)
6580: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 ;..} else {..
6590: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 Tcl_WrongNumArg
65a0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
65b0: 76 2c 20 22 75 70 64 61 74 65 20 64 61 74 61 22 v, "update data"
65c0: 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 );.. return T
65d0: 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f CL_ERROR;..}.../
65e0: 2a 20 55 70 64 61 74 65 20 68 61 73 68 20 66 75 * Update hash fu
65f0: 6e 63 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 44 nction */..if (D
6600: 69 67 65 73 74 55 70 64 61 74 65 28 73 74 61 74 igestUpdate(stat
6610: 65 50 74 72 2c 20 64 61 74 61 2c 20 28 73 69 7a ePtr, data, (siz
6620: 65 5f 74 29 20 64 61 74 61 5f 6c 65 6e 2c 20 31 e_t) data_len, 1
6630: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
6640: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
6650: 52 52 4f 52 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 RROR;..}.. }
6660: 65 6c 73 65 20 7b 0a 09 2f 2a 20 46 69 6e 61 6c else {../* Final
6670: 69 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f ize hash functio
6680: 6e 20 61 6e 64 20 63 61 6c 63 75 6c 61 74 65 20 n and calculate
6690: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 2a message digest *
66a0: 2f 0a 09 69 66 20 28 44 69 67 65 73 74 46 69 6e /..if (DigestFin
66b0: 61 6c 69 7a 65 28 69 6e 74 65 72 70 2c 20 73 74 alize(interp, st
66c0: 61 74 65 50 74 72 2c 20 4e 55 4c 4c 29 20 21 3d atePtr, NULL) !=
66d0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 TCL_OK) {..
66e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
66f0: 3b 0a 09 7d 0a 0a 09 54 63 6c 5f 44 65 6c 65 74 ;..}...Tcl_Delet
6700: 65 43 6f 6d 6d 61 6e 64 46 72 6f 6d 54 6f 6b 65 eCommandFromToke
6710: 6e 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 n(interp, stateP
6720: 74 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20 tr->token);.
6730: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c }. return TCL
6740: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d _OK;.}../*. *---
6750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6790: 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 43 6f 6d . *. * DigestCom
67a0: 6d 61 6e 64 44 65 6c 65 74 65 48 61 6e 64 6c 65 mandDeleteHandle
67b0: 72 20 2d 2d 0a 20 2a 0a 20 2a 09 20 43 61 6c 6c r --. *. *. Call
67c0: 62 61 63 6b 20 74 6f 20 63 6c 65 61 6e 2d 75 70 back to clean-up
67d0: 20 77 68 65 6e 20 64 69 67 65 73 74 20 69 6e 73 when digest ins
67e0: 74 61 6e 63 65 20 63 6f 6d 6d 61 6e 64 20 69 73 tance command is
67f0: 20 64 65 6c 65 74 65 64 2e 0a 20 2a 0a 20 2a 20 deleted.. *. *
6800: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74 68 Returns:. *.Noth
6810: 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ing. *. * Side e
6820: 66 66 65 63 74 73 3a 0a 20 2a 09 44 65 73 74 72 ffects:. *.Destr
6830: 6f 79 73 20 73 74 61 74 65 20 69 6e 66 6f 20 73 oys state info s
6840: 74 72 75 63 74 75 72 65 0a 20 2a 0a 20 2a 2d 2d tructure. *. *--
6850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6890: 2d 0a 20 2a 2f 0a 76 6f 69 64 20 44 69 67 65 73 -. */.void Diges
68a0: 74 43 6f 6d 6d 61 6e 64 44 65 6c 65 74 65 48 61 tCommandDeleteHa
68b0: 6e 64 6c 65 72 28 43 6c 69 65 6e 74 44 61 74 61 ndler(ClientData
68c0: 20 63 6c 69 65 6e 74 44 61 74 61 29 20 7b 0a 20 clientData) {.
68d0: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a DigestState *
68e0: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 statePtr = (Dige
68f0: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e stState *) clien
6900: 74 44 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 43 tData;.. /* C
6910: 6c 65 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 20 44 lean-up */. D
6920: 69 67 65 73 74 53 74 61 74 65 46 72 65 65 28 73 igestStateFree(s
6930: 74 61 74 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a tatePtr);.}../*.
6940: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
6950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6980: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 -----. *. * Dige
6990: 73 74 43 6f 6d 6d 61 6e 64 48 61 6e 64 6c 65 72 stCommandHandler
69a0: 20 2d 2d 0a 20 2a 0a 20 2a 09 20 43 72 65 61 74 --. *. *. Creat
69b0: 65 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 61 6c 6c e command to all
69c0: 6f 77 20 75 73 65 72 20 74 6f 20 61 64 64 20 64 ow user to add d
69d0: 61 74 61 20 74 6f 20 68 61 73 68 20 66 75 6e 63 ata to hash func
69e0: 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 tion.. *. * Retu
69f0: 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f rns:. *.TCL_OK o
6a00: 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 r TCL_ERROR. *.
6a10: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
6a20: 20 2a 09 43 72 65 61 74 65 73 20 63 6f 6d 6d 61 *.Creates comma
6a30: 6e 64 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 nd or error mess
6a40: 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d age. *. *-------
6a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
6a90: 0a 69 6e 74 20 44 69 67 65 73 74 43 6f 6d 6d 61 .int DigestComma
6aa0: 6e 64 48 61 6e 64 6c 65 72 28 54 63 6c 5f 49 6e ndHandler(Tcl_In
6ab0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 terp *interp, Tc
6ac0: 6c 5f 4f 62 6a 20 2a 63 6d 64 4f 62 6a 2c 20 54 l_Obj *cmdObj, T
6ad0: 63 6c 5f 4f 62 6a 20 2a 64 69 67 65 73 74 4f 62 cl_Obj *digestOb
6ae0: 6a 2c 0a 09 54 63 6c 5f 4f 62 6a 20 2a 63 69 70 j,..Tcl_Obj *cip
6af0: 68 65 72 4f 62 6a 2c 20 69 6e 74 20 66 6f 72 6d herObj, int form
6b00: 61 74 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 at, Tcl_Obj *key
6b10: 4f 62 6a 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6d 61 Obj, Tcl_Obj *ma
6b20: 63 4f 62 6a 29 20 7b 0a 20 20 20 20 44 69 67 65 cObj) {. Dige
6b30: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 stState *statePt
6b40: 72 3b 0a 20 20 20 20 63 68 61 72 20 2a 63 6d 64 r;. char *cmd
6b50: 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 Name = Tcl_GetSt
6b60: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 63 6d 64 4f ringFromObj(cmdO
6b70: 62 6a 2c 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 bj, NULL);..
6b80: 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65 64 22 dprintf("Called"
6b90: 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 );.. /* Creat
6ba0: 65 20 73 74 61 74 65 20 64 61 74 61 20 73 74 72 e state data str
6bb0: 75 63 74 75 72 65 20 2a 2f 0a 20 20 20 20 69 66 ucture */. if
6bc0: 20 28 28 73 74 61 74 65 50 74 72 20 3d 20 44 69 ((statePtr = Di
6bd0: 67 65 73 74 53 74 61 74 65 4e 65 77 28 69 6e 74 gestStateNew(int
6be0: 65 72 70 2c 20 66 6f 72 6d 61 74 29 29 20 3d 3d erp, format)) ==
6bf0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 NULL) {..Tcl_Ap
6c00: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
6c10: 70 2c 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 p, "Memory alloc
6c20: 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c 20 28 63 ation error", (c
6c30: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 har *) NULL);..r
6c40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
6c50: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 . }.. /* I
6c60: 6e 69 74 69 61 6c 69 7a 65 20 68 61 73 68 20 66 nitialize hash f
6c70: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 unction */. i
6c80: 66 20 28 44 69 67 65 73 74 49 6e 69 74 69 61 6c f (DigestInitial
6c90: 69 7a 65 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ize(interp, stat
6ca0: 65 50 74 72 2c 20 64 69 67 65 73 74 4f 62 6a 2c ePtr, digestObj,
6cb0: 20 63 69 70 68 65 72 4f 62 6a 2c 20 6b 65 79 4f cipherObj, keyO
6cc0: 62 6a 2c 20 6d 61 63 4f 62 6a 29 20 21 3d 20 54 bj, macObj) != T
6cd0: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e CL_OK) {..return
6ce0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
6cf0: 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 }.. /* Create
6d00: 20 69 6e 73 74 61 6e 63 65 20 63 6f 6d 6d 61 6e instance comman
6d10: 64 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 d */. statePt
6d20: 72 2d 3e 74 6f 6b 65 6e 20 3d 20 54 63 6c 5f 43 r->token = Tcl_C
6d30: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
6d40: 69 6e 74 65 72 70 2c 20 63 6d 64 4e 61 6d 65 2c interp, cmdName,
6d50: 20 44 69 67 65 73 74 49 6e 73 74 61 6e 63 65 4f DigestInstanceO
6d60: 62 6a 43 6d 64 2c 0a 09 28 43 6c 69 65 6e 74 44 bjCmd,..(ClientD
6d70: 61 74 61 29 20 73 74 61 74 65 50 74 72 2c 20 44 ata) statePtr, D
6d80: 69 67 65 73 74 43 6f 6d 6d 61 6e 64 44 65 6c 65 igestCommandDele
6d90: 74 65 48 61 6e 64 6c 65 72 29 3b 0a 20 20 20 20 teHandler);.
6da0: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 6f if (statePtr->to
6db0: 6b 65 6e 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 ken == NULL) {..
6dc0: 44 69 67 65 73 74 53 74 61 74 65 46 72 65 65 28 DigestStateFree(
6dd0: 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 statePtr);..retu
6de0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
6df0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 74 75 }.. /* Retu
6e00: 72 6e 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 rn command name
6e10: 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 */. Tcl_SetOb
6e20: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
6e30: 63 6d 64 4f 62 6a 29 3b 0a 20 20 20 20 72 65 74 cmdObj);. ret
6e40: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a urn TCL_OK;.}...
6e50: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /***************
6e60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6e70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6e80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6e90: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d ****/../*. *----
6ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
6ee0: 20 2a 0a 20 2a 20 44 69 67 65 73 74 44 61 74 61 *. * DigestData
6ef0: 48 61 6e 64 6c 65 72 20 2d 2d 0a 20 2a 0a 20 2a Handler --. *. *
6f00: 09 52 65 74 75 72 6e 20 6d 65 73 73 61 67 65 20 .Return message
6f10: 64 69 67 65 73 74 20 66 6f 72 20 64 61 74 61 20 digest for data
6f20: 75 73 69 6e 67 20 75 73 65 72 20 73 70 65 63 69 using user speci
6f30: 66 69 65 64 20 68 61 73 68 20 66 75 6e 63 74 69 fied hash functi
6f40: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e on.. *. * Return
6f50: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 s:. *.TCL_OK or
6f60: 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 TCL_ERROR. *. *
6f70: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
6f80: 09 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 .Sets result to
6f90: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 6f message digest o
6fa0: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a r error message.
6fb0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
6fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ff0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 --------. */.int
7000: 20 44 69 67 65 73 74 44 61 74 61 48 61 6e 64 6c DigestDataHandl
7010: 65 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 er(Tcl_Interp *i
7020: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a nterp, Tcl_Obj *
7030: 64 61 74 61 4f 62 6a 2c 20 54 63 6c 5f 4f 62 6a dataObj, Tcl_Obj
7040: 20 2a 64 69 67 65 73 74 4f 62 6a 2c 0a 09 54 63 *digestObj,..Tc
7050: 6c 5f 4f 62 6a 20 2a 63 69 70 68 65 72 4f 62 6a l_Obj *cipherObj
7060: 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c 20 54 63 , int format, Tc
7070: 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 2c 20 54 l_Obj *keyObj, T
7080: 63 6c 5f 4f 62 6a 20 2a 6d 61 63 4f 62 6a 29 20 cl_Obj *macObj)
7090: 7b 0a 20 20 20 20 63 68 61 72 20 2a 64 61 74 61 {. char *data
70a0: 3b 0a 20 20 20 20 69 6e 74 20 64 61 74 61 5f 6c ;. int data_l
70b0: 65 6e 3b 0a 20 20 20 20 44 69 67 65 73 74 53 74 en;. DigestSt
70c0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 0a ate *statePtr;..
70d0: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c dprintf("Cal
70e0: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 led");.. /* G
70f0: 65 74 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 64 et data */. d
7100: 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 ata = Tcl_GetByt
7110: 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 64 61 eArrayFromObj(da
7120: 74 61 4f 62 6a 2c 20 26 64 61 74 61 5f 6c 65 6e taObj, &data_len
7130: 29 3b 0a 20 20 20 20 69 66 20 28 64 61 74 61 20 );. if (data
7140: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f == NULL) {..Tcl_
7150: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
7160: 2c 20 22 4e 6f 20 64 61 74 61 22 2c 20 4e 55 4c , "No data", NUL
7170: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
7180: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
7190: 20 20 2f 2a 20 43 72 65 61 74 65 20 73 74 61 74 /* Create stat
71a0: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 e data structure
71b0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 28 73 74 61 */. if ((sta
71c0: 74 65 50 74 72 20 3d 20 44 69 67 65 73 74 53 74 tePtr = DigestSt
71d0: 61 74 65 4e 65 77 28 69 6e 74 65 72 70 2c 20 66 ateNew(interp, f
71e0: 6f 72 6d 61 74 29 29 20 3d 3d 20 4e 55 4c 4c 29 ormat)) == NULL)
71f0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
7200: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4d 65 sult(interp, "Me
7210: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 mory allocation
7220: 65 72 72 6f 72 22 2c 20 28 63 68 61 72 20 2a 29 error", (char *)
7230: 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 NULL);..return
7240: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
7250: 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 63 20 44 69 .. /* Calc Di
7260: 67 65 73 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 gest */. if (
7270: 44 69 67 65 73 74 49 6e 69 74 69 61 6c 69 7a 65 DigestInitialize
7280: 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 (interp, statePt
7290: 72 2c 20 64 69 67 65 73 74 4f 62 6a 2c 20 63 69 r, digestObj, ci
72a0: 70 68 65 72 4f 62 6a 2c 20 6b 65 79 4f 62 6a 2c pherObj, keyObj,
72b0: 20 6d 61 63 4f 62 6a 29 20 21 3d 20 54 43 4c 5f macObj) != TCL_
72c0: 4f 4b 20 7c 7c 0a 09 44 69 67 65 73 74 55 70 64 OK ||..DigestUpd
72d0: 61 74 65 28 73 74 61 74 65 50 74 72 2c 20 64 61 ate(statePtr, da
72e0: 74 61 2c 20 28 73 69 7a 65 5f 74 29 20 64 61 74 ta, (size_t) dat
72f0: 61 5f 6c 65 6e 2c 20 31 29 20 21 3d 20 54 43 4c a_len, 1) != TCL
7300: 5f 4f 4b 20 7c 7c 0a 09 44 69 67 65 73 74 46 69 _OK ||..DigestFi
7310: 6e 61 6c 69 7a 65 28 69 6e 74 65 72 70 2c 20 73 nalize(interp, s
7320: 74 61 74 65 50 74 72 2c 20 4e 55 4c 4c 29 20 21 tatePtr, NULL) !
7330: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 44 69 67 = TCL_OK) {..Dig
7340: 65 73 74 53 74 61 74 65 46 72 65 65 28 73 74 61 estStateFree(sta
7350: 74 65 50 74 72 29 3b 0a 09 72 65 74 75 72 6e 20 tePtr);..return
7360: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
7370: 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 .. /* Clean-u
7380: 70 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 53 p */. DigestS
7390: 74 61 74 65 46 72 65 65 28 73 74 61 74 65 50 74 tateFree(statePt
73a0: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 r);. return T
73b0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a CL_OK;.}../*****
73c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
73d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
73e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
73f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a **************/.
7400: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
7410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
7450: 44 69 67 65 73 74 46 69 6c 65 48 61 6e 64 6c 65 DigestFileHandle
7460: 72 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 r --. *. *.Retur
7470: 6e 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 n message digest
7480: 20 66 6f 72 20 66 69 6c 65 20 75 73 69 6e 67 20 for file using
7490: 75 73 65 72 20 73 70 65 63 69 66 69 65 64 20 68 user specified h
74a0: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a ash function.. *
74b0: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 . * Returns:. *.
74c0: 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 TCL_OK or TCL_ER
74d0: 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ROR. *. * Side e
74e0: 66 66 65 63 74 73 3a 0a 20 2a 09 52 65 73 75 6c ffects:. *.Resul
74f0: 74 20 69 73 20 6d 65 73 73 61 67 65 20 64 69 67 t is message dig
7500: 65 73 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 est or error mes
7510: 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d sage. *. *------
7520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
7560: 2f 0a 69 6e 74 20 44 69 67 65 73 74 46 69 6c 65 /.int DigestFile
7570: 48 61 6e 64 6c 65 72 28 54 63 6c 5f 49 6e 74 65 Handler(Tcl_Inte
7580: 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f rp *interp, Tcl_
7590: 4f 62 6a 20 2a 69 6e 46 69 6c 65 4f 62 6a 2c 20 Obj *inFileObj,
75a0: 54 63 6c 5f 4f 62 6a 20 2a 64 69 67 65 73 74 4f Tcl_Obj *digestO
75b0: 62 6a 2c 0a 09 54 63 6c 5f 4f 62 6a 20 2a 63 69 bj,..Tcl_Obj *ci
75c0: 70 68 65 72 4f 62 6a 2c 20 69 6e 74 20 66 6f 72 pherObj, int for
75d0: 6d 61 74 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 mat, Tcl_Obj *ke
75e0: 79 4f 62 6a 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6d yObj, Tcl_Obj *m
75f0: 61 63 4f 62 6a 29 20 7b 0a 20 20 20 20 44 69 67 acObj) {. Dig
7600: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 estState *stateP
7610: 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e tr;. Tcl_Chan
7620: 6e 65 6c 20 63 68 61 6e 20 3d 20 4e 55 4c 4c 3b nel chan = NULL;
7630: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 . unsigned ch
7640: 61 72 20 62 75 66 5b 42 55 46 46 45 52 5f 53 49 ar buf[BUFFER_SI
7650: 5a 45 5d 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 ZE];. int res
7660: 20 3d 20 54 43 4c 5f 4f 4b 2c 20 6c 65 6e 3b 0a = TCL_OK, len;.
7670: 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 . dprintf("Ca
7680: 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 lled");.. /*
7690: 43 72 65 61 74 65 20 73 74 61 74 65 20 64 61 74 Create state dat
76a0: 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 a structure */.
76b0: 20 20 20 69 66 20 28 28 73 74 61 74 65 50 74 72 if ((statePtr
76c0: 20 3d 20 44 69 67 65 73 74 53 74 61 74 65 4e 65 = DigestStateNe
76d0: 77 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74 w(interp, format
76e0: 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 )) == NULL) {..T
76f0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
7700: 69 6e 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20 interp, "Memory
7710: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 allocation error
7720: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c ", (char *) NULL
7730: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
7740: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
7750: 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 63 68 /* Open file ch
7760: 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 annel */. cha
7770: 6e 20 3d 20 54 63 6c 5f 46 53 4f 70 65 6e 46 69 n = Tcl_FSOpenFi
7780: 6c 65 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 leChannel(interp
7790: 2c 20 69 6e 46 69 6c 65 4f 62 6a 2c 20 22 72 62 , inFileObj, "rb
77a0: 22 2c 20 30 34 34 34 29 3b 0a 20 20 20 20 69 66 ", 0444);. if
77b0: 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 (chan == (Tcl_C
77c0: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
77d0: 09 44 69 67 65 73 74 53 74 61 74 65 46 72 65 65 .DigestStateFree
77e0: 28 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 (statePtr);..ret
77f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
7800: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 6e }.. /* Con
7810: 66 69 67 75 72 65 20 63 68 61 6e 6e 65 6c 20 2a figure channel *
7820: 2f 0a 20 20 20 20 69 66 20 28 28 72 65 73 20 3d /. if ((res =
7830: 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f Tcl_SetChannelO
7840: 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 ption(interp, ch
7850: 61 6e 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f an, "-translatio
7860: 6e 22 2c 20 22 62 69 6e 61 72 79 22 29 29 20 21 n", "binary")) !
7870: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 67 6f 74 = TCL_OK) {..got
7880: 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 o done;. }.
7890: 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c Tcl_SetChannel
78a0: 42 75 66 66 65 72 53 69 7a 65 28 63 68 61 6e 2c BufferSize(chan,
78b0: 20 42 55 46 46 45 52 5f 53 49 5a 45 29 3b 0a 0a BUFFER_SIZE);..
78c0: 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a /* Initializ
78d0: 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 e hash function
78e0: 2a 2f 0a 20 20 20 20 69 66 20 28 28 72 65 73 20 */. if ((res
78f0: 3d 20 44 69 67 65 73 74 49 6e 69 74 69 61 6c 69 = DigestInitiali
7900: 7a 65 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 ze(interp, state
7910: 50 74 72 2c 20 64 69 67 65 73 74 4f 62 6a 2c 20 Ptr, digestObj,
7920: 63 69 70 68 65 72 4f 62 6a 2c 20 6b 65 79 4f 62 cipherObj, keyOb
7930: 6a 2c 20 6d 61 63 4f 62 6a 29 29 20 21 3d 20 54 j, macObj)) != T
7940: 43 4c 5f 4f 4b 29 20 7b 0a 09 67 6f 74 6f 20 64 CL_OK) {..goto d
7950: 6f 6e 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 one;. }..
7960: 2f 2a 20 52 65 61 64 20 66 69 6c 65 20 64 61 74 /* Read file dat
7970: 61 20 61 6e 64 20 75 70 64 61 74 65 20 68 61 73 a and update has
7980: 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 h function */.
7990: 20 20 77 68 69 6c 65 20 28 21 54 63 6c 5f 45 6f while (!Tcl_Eo
79a0: 66 28 63 68 61 6e 29 29 20 7b 0a 09 6c 65 6e 20 f(chan)) {..len
79b0: 3d 20 54 63 6c 5f 52 65 61 64 52 61 77 28 63 68 = Tcl_ReadRaw(ch
79c0: 61 6e 2c 20 28 63 68 61 72 20 2a 29 20 62 75 66 an, (char *) buf
79d0: 2c 20 42 55 46 46 45 52 5f 53 49 5a 45 29 3b 0a , BUFFER_SIZE);.
79e0: 09 69 66 20 28 6c 65 6e 20 3e 20 30 29 20 7b 0a .if (len > 0) {.
79f0: 09 20 20 20 20 69 66 20 28 28 72 65 73 20 3d 20 . if ((res =
7a00: 44 69 67 65 73 74 55 70 64 61 74 65 28 73 74 61 DigestUpdate(sta
7a10: 74 65 50 74 72 2c 20 26 62 75 66 5b 30 5d 2c 20 tePtr, &buf[0],
7a20: 28 73 69 7a 65 5f 74 29 20 6c 65 6e 2c 20 31 29 (size_t) len, 1)
7a30: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
7a40: 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 20 20 20 .goto done;..
7a50: 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 }..}. }..
7a60: 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 68 61 73 /* Finalize has
7a70: 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 63 h function and c
7a80: 61 6c 63 75 6c 61 74 65 20 6d 65 73 73 61 67 65 alculate message
7a90: 20 64 69 67 65 73 74 20 2a 2f 0a 20 20 20 20 72 digest */. r
7aa0: 65 73 20 3d 20 44 69 67 65 73 74 46 69 6e 61 6c es = DigestFinal
7ab0: 69 7a 65 28 69 6e 74 65 72 70 2c 20 73 74 61 74 ize(interp, stat
7ac0: 65 50 74 72 2c 20 4e 55 4c 4c 29 3b 0a 0a 64 6f ePtr, NULL);..do
7ad0: 6e 65 3a 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 ne:. /* Close
7ae0: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
7af0: 69 66 20 28 54 63 6c 5f 43 6c 6f 73 65 28 69 6e if (Tcl_Close(in
7b00: 74 65 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 terp, chan) == T
7b10: 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 73 CL_ERROR) {..res
7b20: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 = TCL_ERROR;.
7b30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 }.. /* Clea
7b40: 6e 2d 75 70 20 2a 2f 0a 20 20 20 20 44 69 67 65 n-up */. Dige
7b50: 73 74 53 74 61 74 65 46 72 65 65 28 73 74 61 74 stStateFree(stat
7b60: 65 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 ePtr);. retur
7b70: 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a n res;.}../*****
7b80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7b90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7ba0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7bb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a **************/.
7bc0: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 .static const ch
7bd0: 61 72 20 2a 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 ar *command_opts
7be0: 20 5b 5d 20 3d 20 7b 20 22 2d 62 69 6e 22 2c 20 [] = { "-bin",
7bf0: 22 2d 62 69 6e 61 72 79 22 2c 20 22 2d 68 65 78 "-binary", "-hex
7c00: 22 2c 20 22 2d 68 65 78 61 64 65 63 69 6d 61 6c ", "-hexadecimal
7c10: 22 2c 0a 20 20 20 20 22 2d 63 68 61 6e 22 2c 20 ",. "-chan",
7c20: 22 2d 63 68 61 6e 6e 65 6c 22 2c 20 22 2d 63 69 "-channel", "-ci
7c30: 70 68 65 72 22 2c 20 22 2d 63 6f 6d 6d 61 6e 64 pher", "-command
7c40: 22 2c 20 22 2d 64 61 74 61 22 2c 20 22 2d 64 69 ", "-data", "-di
7c50: 67 65 73 74 22 2c 20 22 2d 66 69 6c 65 22 2c 20 gest", "-file",
7c60: 22 2d 66 69 6c 65 6e 61 6d 65 22 2c 0a 20 20 20 "-filename",.
7c70: 20 22 2d 68 61 73 68 22 2c 20 22 2d 6b 65 79 22 "-hash", "-key"
7c80: 2c 20 22 2d 6d 61 63 22 2c 20 4e 55 4c 4c 7d 3b , "-mac", NULL};
7c90: 0a 0a 65 6e 75 6d 20 5f 63 6f 6d 6d 61 6e 64 5f ..enum _command_
7ca0: 6f 70 74 73 20 7b 0a 20 20 20 20 5f 6f 70 74 5f opts {. _opt_
7cb0: 62 69 6e 2c 20 5f 6f 70 74 5f 62 69 6e 61 72 79 bin, _opt_binary
7cc0: 2c 20 5f 6f 70 74 5f 68 65 78 2c 20 5f 6f 70 74 , _opt_hex, _opt
7cd0: 5f 68 65 78 61 64 65 63 69 6d 61 6c 2c 20 5f 6f _hexadecimal, _o
7ce0: 70 74 5f 63 68 61 6e 2c 20 5f 6f 70 74 5f 63 68 pt_chan, _opt_ch
7cf0: 61 6e 6e 65 6c 2c 20 5f 6f 70 74 5f 63 69 70 68 annel, _opt_ciph
7d00: 65 72 2c 0a 20 20 20 20 5f 6f 70 74 5f 63 6f 6d er,. _opt_com
7d10: 6d 61 6e 64 2c 20 5f 6f 70 74 5f 64 61 74 61 2c mand, _opt_data,
7d20: 20 5f 6f 70 74 5f 64 69 67 65 73 74 2c 20 5f 6f _opt_digest, _o
7d30: 70 74 5f 66 69 6c 65 2c 20 5f 6f 70 74 5f 66 69 pt_file, _opt_fi
7d40: 6c 65 6e 61 6d 65 2c 20 5f 6f 70 74 5f 68 61 73 lename, _opt_has
7d50: 68 2c 20 5f 6f 70 74 5f 6b 65 79 2c 20 5f 6f 70 h, _opt_key, _op
7d60: 74 5f 6d 61 63 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d t_mac.};../*. *-
7d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7db0: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 4d --. *. * DigestM
7dc0: 61 69 6e 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 ain --. *. *.Ret
7dd0: 75 72 6e 20 6d 65 73 73 61 67 65 20 64 69 67 65 urn message dige
7de0: 73 74 20 6f 72 20 4d 65 73 73 61 67 65 20 41 75 st or Message Au
7df0: 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 43 6f 64 thentication Cod
7e00: 65 20 28 4d 41 43 29 20 6f 66 0a 20 2a 09 64 61 e (MAC) of. *.da
7e10: 74 61 20 75 73 69 6e 67 20 75 73 65 72 20 73 70 ta using user sp
7e20: 65 63 69 66 69 65 64 20 68 61 73 68 20 66 75 6e ecified hash fun
7e30: 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 ction.. *. * Ret
7e40: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 urns:. *.TCL_OK
7e50: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a or TCL_ERROR. *.
7e60: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
7e70: 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20 . *.Sets result
7e80: 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 to message diges
7e90: 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 t or error messa
7ea0: 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ge. *. *--------
7eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
7ef0: 73 74 61 74 69 63 20 69 6e 74 20 44 69 67 65 73 static int Diges
7f00: 74 4d 61 69 6e 28 69 6e 74 20 74 79 70 65 2c 20 tMain(int type,
7f10: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
7f20: 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 rp, int objc, Tc
7f30: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a l_Obj *const obj
7f40: 76 5b 5d 29 20 7b 0a 20 20 20 20 69 6e 74 20 73 v[]) {. int s
7f50: 74 61 72 74 20 3d 20 31 2c 20 66 6f 72 6d 61 74 tart = 1, format
7f60: 20 3d 20 48 45 58 5f 46 4f 52 4d 41 54 2c 20 72 = HEX_FORMAT, r
7f70: 65 73 20 3d 20 54 43 4c 5f 4f 4b 2c 20 66 6e 3b es = TCL_OK, fn;
7f80: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 69 . Tcl_Obj *ci
7f90: 70 68 65 72 4f 62 6a 20 3d 20 4e 55 4c 4c 2c 20 pherObj = NULL,
7fa0: 2a 63 6d 64 4f 62 6a 20 3d 20 4e 55 4c 4c 2c 20 *cmdObj = NULL,
7fb0: 2a 64 61 74 61 4f 62 6a 20 3d 20 4e 55 4c 4c 2c *dataObj = NULL,
7fc0: 20 2a 64 69 67 65 73 74 4f 62 6a 20 3d 20 4e 55 *digestObj = NU
7fd0: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 LL;. Tcl_Obj
7fe0: 2a 66 69 6c 65 4f 62 6a 20 3d 20 4e 55 4c 4c 2c *fileObj = NULL,
7ff0: 20 2a 6b 65 79 4f 62 6a 20 3d 20 4e 55 4c 4c 2c *keyObj = NULL,
8000: 20 2a 6d 61 63 4f 62 6a 20 3d 20 4e 55 4c 4c 3b *macObj = NULL;
8010: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
8020: 2a 63 68 61 6e 6e 65 6c 20 3d 20 4e 55 4c 4c 2c *channel = NULL,
8030: 20 2a 6f 70 74 3b 0a 0a 20 20 20 20 64 70 72 69 *opt;.. dpri
8040: 6e 74 66 28 22 43 61 6c 6c 65 64 22 29 3b 0a 0a ntf("Called");..
8050: 20 20 20 20 2f 2a 20 43 6c 65 61 72 20 69 6e 74 /* Clear int
8060: 65 72 70 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 erp result */.
8070: 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c Tcl_ResetResul
8080: 74 28 69 6e 74 65 72 70 29 3b 0a 0a 20 20 20 20 t(interp);..
8090: 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67 20 /* Validate arg
80a0: 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 count */. if
80b0: 28 6f 62 6a 63 20 3c 20 33 20 7c 7c 20 6f 62 6a (objc < 3 || obj
80c0: 63 20 3e 20 31 32 29 20 7b 0a 09 54 63 6c 5f 57 c > 12) {..Tcl_W
80d0: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 rongNumArgs(inte
80e0: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 2d rp, 1, objv, "?-
80f0: 62 69 6e 7c 2d 68 65 78 3f 20 3f 2d 63 69 70 68 bin|-hex? ?-ciph
8100: 65 72 20 6e 61 6d 65 3f 20 3f 2d 64 69 67 65 73 er name? ?-diges
8110: 74 20 6e 61 6d 65 3f 20 3f 2d 6b 65 79 20 6b 65 t name? ?-key ke
8120: 79 3f 20 3f 2d 6d 61 63 20 6e 61 6d 65 3f 20 5b y? ?-mac name? [
8130: 2d 63 68 61 6e 6e 65 6c 20 63 68 61 6e 20 7c 20 -channel chan |
8140: 2d 63 6f 6d 6d 61 6e 64 20 63 6d 64 4e 61 6d 65 -command cmdName
8150: 20 7c 20 2d 66 69 6c 65 20 66 69 6c 65 6e 61 6d | -file filenam
8160: 65 20 7c 20 3f 2d 64 61 74 61 3f 20 64 61 74 61 e | ?-data? data
8170: 5d 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c ]");..return TCL
8180: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
8190: 20 20 20 2f 2a 20 53 70 65 63 69 61 6c 20 63 61 /* Special ca
81a0: 73 65 20 6f 66 20 66 69 72 73 74 20 61 72 67 20 se of first arg
81b0: 69 73 20 64 69 67 65 73 74 2c 20 63 69 70 68 65 is digest, ciphe
81c0: 72 2c 20 6f 72 20 6d 61 63 20 2a 2f 0a 20 20 20 r, or mac */.
81d0: 20 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 opt = Tcl_GetSt
81e0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 ringFromObj(objv
81f0: 5b 73 74 61 72 74 5d 2c 20 4e 55 4c 4c 29 3b 0a [start], NULL);.
8200: 20 20 20 20 69 66 20 28 6f 70 74 5b 30 5d 20 21 if (opt[0] !
8210: 3d 20 27 2d 27 29 20 7b 0a 09 73 77 69 74 63 68 = '-') {..switch
8220: 28 74 79 70 65 29 20 7b 0a 09 63 61 73 65 20 54 (type) {..case T
8230: 59 50 45 5f 4d 44 3a 0a 09 63 61 73 65 20 54 59 YPE_MD:..case TY
8240: 50 45 5f 48 4d 41 43 3a 0a 09 20 20 20 20 64 69 PE_HMAC:.. di
8250: 67 65 73 74 4f 62 6a 20 3d 20 6f 62 6a 76 5b 73 gestObj = objv[s
8260: 74 61 72 74 2b 2b 5d 3b 0a 09 20 20 20 20 62 72 tart++];.. br
8270: 65 61 6b 3b 0a 09 63 61 73 65 20 54 59 50 45 5f eak;..case TYPE_
8280: 43 4d 41 43 3a 0a 09 20 20 20 20 63 69 70 68 65 CMAC:.. ciphe
8290: 72 4f 62 6a 20 3d 20 6f 62 6a 76 5b 73 74 61 72 rObj = objv[star
82a0: 74 2b 2b 5d 3b 0a 09 20 20 20 20 62 72 65 61 6b t++];.. break
82b0: 3b 0a 09 63 61 73 65 20 54 59 50 45 5f 4d 41 43 ;..case TYPE_MAC
82c0: 3a 0a 09 20 20 20 20 6d 61 63 4f 62 6a 20 3d 20 :.. macObj =
82d0: 6f 62 6a 76 5b 73 74 61 72 74 2b 2b 5d 3b 0a 09 objv[start++];..
82e0: 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 break;..}.
82f0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 }.. /* Get
8300: 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 66 options */. f
8310: 6f 72 20 28 69 6e 74 20 69 64 78 20 3d 20 73 74 or (int idx = st
8320: 61 72 74 3b 20 69 64 78 20 3c 20 6f 62 6a 63 3b art; idx < objc;
8330: 20 69 64 78 2b 2b 29 20 7b 0a 09 2f 2a 20 53 70 idx++) {../* Sp
8340: 65 63 69 61 6c 20 63 61 73 65 20 66 6f 72 20 77 ecial case for w
8350: 68 65 6e 20 6c 61 73 74 20 61 72 67 20 69 73 20 hen last arg is
8360: 64 61 74 61 20 2a 2f 0a 09 69 66 20 28 69 64 78 data */..if (idx
8370: 20 3d 3d 20 6f 62 6a 63 20 2d 20 31 29 20 7b 0a == objc - 1) {.
8380: 09 20 20 20 20 6f 70 74 20 3d 20 54 63 6c 5f 47 . opt = Tcl_G
8390: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
83a0: 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 objv[idx], NULL)
83b0: 3b 0a 09 20 20 20 20 69 66 20 28 6f 70 74 5b 30 ;.. if (opt[0
83c0: 5d 20 21 3d 20 27 2d 27 20 26 26 20 64 61 74 61 ] != '-' && data
83d0: 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 Obj == NULL) {..
83e0: 09 64 61 74 61 4f 62 6a 20 3d 20 6f 62 6a 76 5b .dataObj = objv[
83f0: 69 64 78 5d 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 idx];...break;..
8400: 20 20 20 20 7d 0a 09 7d 0a 0a 09 2f 2a 20 47 65 }..}.../* Ge
8410: 74 20 6f 70 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 t option */..if
8420: 28 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f (Tcl_GetIndexFro
8430: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a mObj(interp, obj
8440: 76 5b 69 64 78 5d 2c 20 63 6f 6d 6d 61 6e 64 5f v[idx], command_
8450: 6f 70 74 73 2c 20 22 6f 70 74 69 6f 6e 22 2c 20 opts, "option",
8460: 30 2c 20 26 66 6e 29 20 21 3d 20 54 43 4c 5f 4f 0, &fn) != TCL_O
8470: 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e K) {.. return
8480: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a TCL_ERROR;..}..
8490: 09 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67 ./* Validate arg
84a0: 20 68 61 73 20 61 20 76 61 6c 75 65 20 2a 2f 0a has a value */.
84b0: 09 69 66 20 28 66 6e 20 3e 20 5f 6f 70 74 5f 68 .if (fn > _opt_h
84c0: 65 78 61 64 65 63 69 6d 61 6c 29 20 7b 0a 09 20 exadecimal) {..
84d0: 20 20 20 69 66 20 28 2b 2b 69 64 78 20 3e 3d 20 if (++idx >=
84e0: 6f 62 6a 63 29 20 7b 0a 09 09 54 63 6c 5f 41 70 objc) {...Tcl_Ap
84f0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
8500: 70 2c 20 22 4e 6f 20 76 61 6c 75 65 20 66 6f 72 p, "No value for
8510: 20 6f 70 74 69 6f 6e 20 5c 22 22 2c 20 63 6f 6d option \"", com
8520: 6d 61 6e 64 5f 6f 70 74 73 5b 66 6e 5d 2c 20 22 mand_opts[fn], "
8530: 5c 22 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 \"", (char *) NU
8540: 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 LL);...return TC
8550: 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a L_ERROR;.. }.
8560: 09 7d 0a 0a 09 73 77 69 74 63 68 28 66 6e 29 20 .}...switch(fn)
8570: 7b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 62 69 6e {..case _opt_bin
8580: 3a 0a 09 63 61 73 65 20 5f 6f 70 74 5f 62 69 6e :..case _opt_bin
8590: 61 72 79 3a 0a 09 20 20 20 20 66 6f 72 6d 61 74 ary:.. format
85a0: 20 3d 20 42 49 4e 5f 46 4f 52 4d 41 54 3b 0a 09 = BIN_FORMAT;..
85b0: 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 break;..case
85c0: 20 5f 6f 70 74 5f 68 65 78 3a 0a 09 63 61 73 65 _opt_hex:..case
85d0: 20 5f 6f 70 74 5f 68 65 78 61 64 65 63 69 6d 61 _opt_hexadecima
85e0: 6c 3a 0a 09 20 20 20 20 66 6f 72 6d 61 74 20 3d l:.. format =
85f0: 20 48 45 58 5f 46 4f 52 4d 41 54 3b 0a 09 20 20 HEX_FORMAT;..
8600: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f break;..case _
8610: 6f 70 74 5f 63 68 61 6e 3a 0a 09 63 61 73 65 20 opt_chan:..case
8620: 5f 6f 70 74 5f 63 68 61 6e 6e 65 6c 3a 0a 20 20 _opt_channel:.
8630: 20 20 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 53 . GET_OPT_S
8640: 54 52 49 4e 47 28 6f 62 6a 76 5b 69 64 78 5d 2c TRING(objv[idx],
8650: 20 63 68 61 6e 6e 65 6c 2c 20 4e 55 4c 4c 29 3b channel, NULL);
8660: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 .. break;..ca
8670: 73 65 20 5f 6f 70 74 5f 63 69 70 68 65 72 3a 0a se _opt_cipher:.
8680: 09 20 20 20 20 63 69 70 68 65 72 4f 62 6a 20 3d . cipherObj =
8690: 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 09 20 20 20 objv[idx];..
86a0: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f break;..case _o
86b0: 70 74 5f 63 6f 6d 6d 61 6e 64 3a 0a 09 20 20 20 pt_command:..
86c0: 20 63 6d 64 4f 62 6a 20 3d 20 6f 62 6a 76 5b 69 cmdObj = objv[i
86d0: 64 78 5d 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b dx];.. break;
86e0: 0a 09 63 61 73 65 20 5f 6f 70 74 5f 64 61 74 61 ..case _opt_data
86f0: 3a 0a 09 20 20 20 20 64 61 74 61 4f 62 6a 20 3d :.. dataObj =
8700: 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 09 20 20 20 objv[idx];..
8710: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f break;..case _o
8720: 70 74 5f 64 69 67 65 73 74 3a 0a 09 63 61 73 65 pt_digest:..case
8730: 20 5f 6f 70 74 5f 68 61 73 68 3a 0a 09 20 20 20 _opt_hash:..
8740: 20 64 69 67 65 73 74 4f 62 6a 20 3d 20 6f 62 6a digestObj = obj
8750: 76 5b 69 64 78 5d 3b 0a 09 20 20 20 20 62 72 65 v[idx];.. bre
8760: 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 66 ak;..case _opt_f
8770: 69 6c 65 3a 0a 09 63 61 73 65 20 5f 6f 70 74 5f ile:..case _opt_
8780: 66 69 6c 65 6e 61 6d 65 3a 0a 09 20 20 20 20 66 filename:.. f
8790: 69 6c 65 4f 62 6a 20 3d 20 6f 62 6a 76 5b 69 64 ileObj = objv[id
87a0: 78 5d 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a x];.. break;.
87b0: 09 63 61 73 65 20 5f 6f 70 74 5f 6b 65 79 3a 0a .case _opt_key:.
87c0: 09 20 20 20 20 6b 65 79 4f 62 6a 20 3d 20 6f 62 . keyObj = ob
87d0: 6a 76 5b 69 64 78 5d 3b 0a 09 20 20 20 20 62 72 jv[idx];.. br
87e0: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f eak;..case _opt_
87f0: 6d 61 63 3a 0a 09 20 20 20 20 6d 61 63 4f 62 6a mac:.. macObj
8800: 20 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 09 20 = objv[idx];..
8810: 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 break;..}.
8820: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b }.. /* Check
8830: 20 74 79 70 65 73 20 2a 2f 0a 20 20 20 20 69 66 types */. if
8840: 20 28 74 79 70 65 20 3d 3d 20 54 59 50 45 5f 4d (type == TYPE_M
8850: 44 29 20 7b 0a 09 20 69 66 20 28 6d 61 63 4f 62 D) {.. if (macOb
8860: 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 j != NULL) {..
8870: 20 20 74 79 70 65 20 3d 20 54 59 50 45 5f 4d 41 type = TYPE_MA
8880: 43 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 63 C;..} else if (c
8890: 69 70 68 65 72 4f 62 6a 20 21 3d 20 4e 55 4c 4c ipherObj != NULL
88a0: 29 20 7b 0a 09 20 20 20 20 74 79 70 65 20 3d 20 ) {.. type =
88b0: 54 59 50 45 5f 43 4d 41 43 3b 0a 09 7d 20 65 6c TYPE_CMAC;..} el
88c0: 73 65 20 69 66 20 28 6b 65 79 4f 62 6a 20 21 3d se if (keyObj !=
88d0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 74 79 NULL) {.. ty
88e0: 70 65 20 3d 20 54 59 50 45 5f 48 4d 41 43 3b 0a pe = TYPE_HMAC;.
88f0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 .}. }.. if
8900: 20 28 74 79 70 65 20 3d 3d 20 54 59 50 45 5f 4d (type == TYPE_M
8910: 41 43 29 20 7b 0a 09 69 66 20 28 6d 61 63 4f 62 AC) {..if (macOb
8920: 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 j != NULL) {..
8930: 20 20 63 68 61 72 20 2a 6d 61 63 4e 61 6d 65 20 char *macName
8940: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 = Tcl_GetStringF
8950: 72 6f 6d 4f 62 6a 28 6d 61 63 4f 62 6a 2c 20 4e romObj(macObj, N
8960: 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20 28 73 ULL);.. if (s
8970: 74 72 63 6d 70 28 6d 61 63 4e 61 6d 65 2c 22 63 trcmp(macName,"c
8980: 6d 61 63 22 29 20 3d 3d 20 30 29 20 7b 0a 09 09 mac") == 0) {...
8990: 74 79 70 65 20 3d 20 54 59 50 45 5f 43 4d 41 43 type = TYPE_CMAC
89a0: 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 69 66 ;.. } else if
89b0: 20 28 73 74 72 63 6d 70 28 6d 61 63 4e 61 6d 65 (strcmp(macName
89c0: 2c 22 68 6d 61 63 22 29 20 3d 3d 20 30 29 20 7b ,"hmac") == 0) {
89d0: 0a 09 09 74 79 70 65 20 3d 20 54 59 50 45 5f 48 ...type = TYPE_H
89e0: 4d 41 43 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 MAC;.. } else
89f0: 20 7b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 {...Tcl_AppendR
8a00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 69 esult(interp, "i
8a10: 6e 76 61 6c 69 64 20 4d 41 43 20 5c 22 22 2c 20 nvalid MAC \"",
8a20: 6d 61 63 4e 61 6d 65 2c 20 22 5c 22 22 2c 20 4e macName, "\"", N
8a30: 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 ULL);...return T
8a40: 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d CL_ERROR;.. }
8a50: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
8a60: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
8a70: 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 4d 41 43 (interp, "no MAC
8a80: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 ", NULL);.. r
8a90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
8aa0: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f ..}. }.. /
8ab0: 2a 20 43 61 6c 63 20 64 69 67 65 73 74 20 6f 6e * Calc digest on
8ac0: 20 66 69 6c 65 2c 20 73 74 61 63 6b 65 64 20 63 file, stacked c
8ad0: 68 61 6e 6e 65 6c 2c 20 75 73 69 6e 67 20 69 6e hannel, using in
8ae0: 73 74 61 6e 63 65 20 63 6f 6d 6d 61 6e 64 2c 20 stance command,
8af0: 6f 72 20 64 61 74 61 20 62 6c 6f 62 20 2a 2f 0a or data blob */.
8b00: 20 20 20 20 69 66 20 28 66 69 6c 65 4f 62 6a 20 if (fileObj
8b10: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 != NULL) {..res
8b20: 3d 20 44 69 67 65 73 74 46 69 6c 65 48 61 6e 64 = DigestFileHand
8b30: 6c 65 72 28 69 6e 74 65 72 70 2c 20 66 69 6c 65 ler(interp, file
8b40: 4f 62 6a 2c 20 64 69 67 65 73 74 4f 62 6a 2c 20 Obj, digestObj,
8b50: 63 69 70 68 65 72 4f 62 6a 2c 20 66 6f 72 6d 61 cipherObj, forma
8b60: 74 20 7c 20 74 79 70 65 2c 20 6b 65 79 4f 62 6a t | type, keyObj
8b70: 2c 20 6d 61 63 4f 62 6a 29 3b 0a 20 20 20 20 7d , macObj);. }
8b80: 20 65 6c 73 65 20 69 66 20 28 63 68 61 6e 6e 65 else if (channe
8b90: 6c 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 l != NULL) {..re
8ba0: 73 20 3d 20 44 69 67 65 73 74 43 68 61 6e 6e 65 s = DigestChanne
8bb0: 6c 48 61 6e 64 6c 65 72 28 69 6e 74 65 72 70 2c lHandler(interp,
8bc0: 20 63 68 61 6e 6e 65 6c 2c 20 64 69 67 65 73 74 channel, digest
8bd0: 4f 62 6a 2c 20 63 69 70 68 65 72 4f 62 6a 2c 20 Obj, cipherObj,
8be0: 66 6f 72 6d 61 74 20 7c 20 74 79 70 65 2c 20 6b format | type, k
8bf0: 65 79 4f 62 6a 2c 20 6d 61 63 4f 62 6a 29 3b 0a eyObj, macObj);.
8c00: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 } else if (c
8c10: 6d 64 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b mdObj != NULL) {
8c20: 0a 09 72 65 73 20 3d 20 44 69 67 65 73 74 43 6f ..res = DigestCo
8c30: 6d 6d 61 6e 64 48 61 6e 64 6c 65 72 28 69 6e 74 mmandHandler(int
8c40: 65 72 70 2c 20 63 6d 64 4f 62 6a 2c 20 64 69 67 erp, cmdObj, dig
8c50: 65 73 74 4f 62 6a 2c 20 63 69 70 68 65 72 4f 62 estObj, cipherOb
8c60: 6a 2c 20 66 6f 72 6d 61 74 20 7c 20 74 79 70 65 j, format | type
8c70: 2c 20 6b 65 79 4f 62 6a 2c 20 6d 61 63 4f 62 6a , keyObj, macObj
8c80: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 );. } else if
8c90: 20 28 64 61 74 61 4f 62 6a 20 21 3d 20 4e 55 4c (dataObj != NUL
8ca0: 4c 29 20 7b 0a 09 72 65 73 20 3d 20 44 69 67 65 L) {..res = Dige
8cb0: 73 74 44 61 74 61 48 61 6e 64 6c 65 72 28 69 6e stDataHandler(in
8cc0: 74 65 72 70 2c 20 64 61 74 61 4f 62 6a 2c 20 64 terp, dataObj, d
8cd0: 69 67 65 73 74 4f 62 6a 2c 20 63 69 70 68 65 72 igestObj, cipher
8ce0: 4f 62 6a 2c 20 66 6f 72 6d 61 74 20 7c 20 74 79 Obj, format | ty
8cf0: 70 65 2c 20 6b 65 79 4f 62 6a 2c 20 6d 61 63 4f pe, keyObj, macO
8d00: 62 6a 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 bj);. } else
8d10: 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 {..Tcl_AppendRes
8d20: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 ult(interp, "No
8d30: 6f 70 65 72 61 74 69 6f 6e 3a 20 55 73 65 20 2d operation: Use -
8d40: 63 68 61 6e 6e 65 6c 2c 20 2d 63 6f 6d 6d 61 6e channel, -comman
8d50: 64 2c 20 2d 64 61 74 61 2c 20 6f 72 20 2d 66 69 d, -data, or -fi
8d60: 6c 65 20 6f 70 74 69 6f 6e 22 2c 20 4e 55 4c 4c le option", NULL
8d70: 29 3b 0a 09 72 65 73 20 3d 20 54 43 4c 5f 45 52 );..res = TCL_ER
8d80: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ROR;. }. r
8d90: 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a eturn res;.}../*
8da0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
8db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8de0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4d 65 73 ------. *. * Mes
8df0: 73 61 67 65 20 44 69 67 65 73 74 20 61 6e 64 20 sage Digest and
8e00: 4d 65 73 73 61 67 65 20 41 75 74 68 65 6e 74 69 Message Authenti
8e10: 63 61 74 69 6f 6e 20 43 6f 64 65 20 43 6f 6d 6d cation Code Comm
8e20: 61 6e 64 73 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 ands --. *. *.Re
8e30: 74 75 72 6e 20 4d 65 73 73 61 67 65 20 44 69 67 turn Message Dig
8e40: 65 73 74 20 28 4d 44 29 20 6f 72 20 4d 65 73 73 est (MD) or Mess
8e50: 61 67 65 20 41 75 74 68 65 6e 74 69 63 61 74 69 age Authenticati
8e60: 6f 6e 20 43 6f 64 65 20 28 4d 41 43 29 2e 0a 20 on Code (MAC)..
8e70: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a *. * Returns:. *
8e80: 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 .TCL_OK or TCL_E
8e90: 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 RROR. *. * Side
8ea0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 effects:. *.Sets
8eb0: 20 72 65 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 result to messa
8ec0: 67 65 20 64 69 67 65 73 74 20 6f 72 20 65 72 72 ge digest or err
8ed0: 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a or message. *. *
8ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f20: 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 ---. */.static i
8f30: 6e 74 20 4d 64 4f 62 6a 43 6d 64 28 43 6c 69 65 nt MdObjCmd(Clie
8f40: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
8f50: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
8f60: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
8f70: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
8f80: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 objv[]) {. re
8f90: 74 75 72 6e 20 44 69 67 65 73 74 4d 61 69 6e 28 turn DigestMain(
8fa0: 54 59 50 45 5f 4d 44 2c 20 69 6e 74 65 72 70 2c TYPE_MD, interp,
8fb0: 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a objc, objv);.}.
8fc0: 0a 73 74 61 74 69 63 20 69 6e 74 20 43 4d 41 43 .static int CMAC
8fd0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
8fe0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
8ff0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
9000: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
9010: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
9020: 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 ]) {. return
9030: 44 69 67 65 73 74 4d 61 69 6e 28 54 59 50 45 5f DigestMain(TYPE_
9040: 43 4d 41 43 2c 20 69 6e 74 65 72 70 2c 20 6f 62 CMAC, interp, ob
9050: 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 0a 73 74 jc, objv);.}..st
9060: 61 74 69 63 20 69 6e 74 20 48 4d 41 43 4f 62 6a atic int HMACObj
9070: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
9080: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
9090: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
90a0: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
90b0: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
90c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69 67 {. return Dig
90d0: 65 73 74 4d 61 69 6e 28 54 59 50 45 5f 48 4d 41 estMain(TYPE_HMA
90e0: 43 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c C, interp, objc,
90f0: 20 6f 62 6a 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 objv);.}..stati
9100: 63 20 69 6e 74 20 4d 41 43 4f 62 6a 43 6d 64 28 c int MACObjCmd(
9110: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
9120: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
9130: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
9140: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
9150: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
9160: 20 20 72 65 74 75 72 6e 20 44 69 67 65 73 74 4d return DigestM
9170: 61 69 6e 28 54 59 50 45 5f 4d 41 43 2c 20 69 6e ain(TYPE_MAC, in
9180: 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 terp, objc, objv
9190: 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d );.}../*. *-----
91a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
91b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
91c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
91d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
91e0: 2a 0a 20 2a 20 4d 65 73 73 61 67 65 20 44 69 67 *. * Message Dig
91f0: 65 73 74 20 43 6f 6e 76 65 6e 69 65 6e 63 65 20 est Convenience
9200: 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a 20 Commands --. *.
9210: 2a 09 43 6f 6e 76 65 6e 69 65 6e 63 65 20 63 6f *.Convenience co
9220: 6d 6d 61 6e 64 73 20 66 6f 72 20 73 65 6c 65 63 mmands for selec
9230: 74 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 t message digest
9240: 73 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 s.. *. * Returns
9250: 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 :. *.TCL_OK or T
9260: 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 CL_ERROR. *. * S
9270: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
9280: 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 6d Sets result to m
9290: 65 73 73 61 67 65 20 64 69 67 65 73 74 20 6f 72 essage digest or
92a0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 error message.
92b0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
92c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
92d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
92e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
92f0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 20 69 6e 74 -------. */. int
9300: 20 54 65 6d 70 6c 61 74 65 43 6d 64 28 54 63 6c TemplateCmd(Tcl
9310: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
9320: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
9330: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
9340: 2c 20 63 68 61 72 20 2a 64 69 67 65 73 74 4e 61 , char *digestNa
9350: 6d 65 2c 20 69 6e 74 20 66 6f 72 6d 61 74 29 20 me, int format)
9360: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 64 {. Tcl_Obj *d
9370: 61 74 61 4f 62 6a 2c 20 2a 64 69 67 65 73 74 4f ataObj, *digestO
9380: 62 6a 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 3b bj;. int res;
9390: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d .. if (objc =
93a0: 3d 20 32 29 20 7b 0a 09 64 61 74 61 4f 62 6a 20 = 2) {..dataObj
93b0: 3d 20 6f 62 6a 76 5b 31 5d 3b 0a 20 20 20 20 7d = objv[1];. }
93c0: 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 57 72 6f else {..Tcl_Wro
93d0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
93e0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 64 61 74 61 , 1, objv, "data
93f0: 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ");..return TCL_
9400: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
9410: 20 20 64 69 67 65 73 74 4f 62 6a 20 3d 20 54 63 digestObj = Tc
9420: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 64 l_NewStringObj(d
9430: 69 67 65 73 74 4e 61 6d 65 2c 20 2d 31 29 3b 0a igestName, -1);.
9440: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
9450: 6f 75 6e 74 28 64 69 67 65 73 74 4f 62 6a 29 3b ount(digestObj);
9460: 0a 20 20 20 20 72 65 73 20 3d 20 44 69 67 65 73 . res = Diges
9470: 74 44 61 74 61 48 61 6e 64 6c 65 72 28 69 6e 74 tDataHandler(int
9480: 65 72 70 2c 20 64 61 74 61 4f 62 6a 2c 20 64 69 erp, dataObj, di
9490: 67 65 73 74 4f 62 6a 2c 20 4e 55 4c 4c 2c 20 66 gestObj, NULL, f
94a0: 6f 72 6d 61 74 2c 20 4e 55 4c 4c 2c 20 4e 55 4c ormat, NULL, NUL
94b0: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 L);. Tcl_Decr
94c0: 52 65 66 43 6f 75 6e 74 28 64 69 67 65 73 74 4f RefCount(digestO
94d0: 62 6a 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 bj);. return
94e0: 72 65 73 3b 0a 7d 0a 20 0a 69 6e 74 20 4d 44 34 res;.}. .int MD4
94f0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
9500: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
9510: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
9520: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
9530: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
9540: 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 ]) {. return
9550: 54 65 6d 70 6c 61 74 65 43 6d 64 28 69 6e 74 65 TemplateCmd(inte
9560: 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 rp, objc, objv,
9570: 22 6d 64 34 22 2c 20 48 45 58 5f 46 4f 52 4d 41 "md4", HEX_FORMA
9580: 54 20 7c 20 54 59 50 45 5f 4d 44 29 3b 0a 7d 0a T | TYPE_MD);.}.
9590: 0a 69 6e 74 20 4d 44 35 4f 62 6a 43 6d 64 28 43 .int MD5ObjCmd(C
95a0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
95b0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
95c0: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 *interp, int ob
95d0: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
95e0: 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 st objv[]) {.
95f0: 20 72 65 74 75 72 6e 20 54 65 6d 70 6c 61 74 65 return Template
9600: 43 6d 64 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 Cmd(interp, objc
9610: 2c 20 6f 62 6a 76 2c 20 22 6d 64 35 22 2c 20 48 , objv, "md5", H
9620: 45 58 5f 46 4f 52 4d 41 54 20 7c 20 54 59 50 45 EX_FORMAT | TYPE
9630: 5f 4d 44 29 3b 0a 7d 0a 0a 69 6e 74 20 53 48 41 _MD);.}..int SHA
9640: 31 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 1ObjCmd(ClientDa
9650: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
9660: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
9670: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
9680: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
9690: 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e []) {. return
96a0: 20 54 65 6d 70 6c 61 74 65 43 6d 64 28 69 6e 74 TemplateCmd(int
96b0: 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c erp, objc, objv,
96c0: 20 22 73 68 61 31 22 2c 20 48 45 58 5f 46 4f 52 "sha1", HEX_FOR
96d0: 4d 41 54 20 7c 20 54 59 50 45 5f 4d 44 29 3b 0a MAT | TYPE_MD);.
96e0: 7d 0a 0a 69 6e 74 20 53 48 41 32 35 36 4f 62 6a }..int SHA256Obj
96f0: 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Cmd(ClientData c
9700: 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 lientData, Tcl_I
9710: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 nterp *interp, i
9720: 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a nt objc, Tcl_Obj
9730: 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 *const objv[])
9740: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 65 6d {. return Tem
9750: 70 6c 61 74 65 43 6d 64 28 69 6e 74 65 72 70 2c plateCmd(interp,
9760: 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 22 73 68 objc, objv, "sh
9770: 61 32 35 36 22 2c 20 48 45 58 5f 46 4f 52 4d 41 a256", HEX_FORMA
9780: 54 20 7c 20 54 59 50 45 5f 4d 44 29 3b 0a 7d 0a T | TYPE_MD);.}.
9790: 0a 69 6e 74 20 53 48 41 35 31 32 4f 62 6a 43 6d .int SHA512ObjCm
97a0: 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 d(ClientData cli
97b0: 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 entData, Tcl_Int
97c0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
97d0: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
97e0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a const objv[]) {.
97f0: 20 20 20 20 72 65 74 75 72 6e 20 54 65 6d 70 6c return Templ
9800: 61 74 65 43 6d 64 28 69 6e 74 65 72 70 2c 20 6f ateCmd(interp, o
9810: 62 6a 63 2c 20 6f 62 6a 76 2c 20 22 73 68 61 35 bjc, objv, "sha5
9820: 31 32 22 2c 20 48 45 58 5f 46 4f 52 4d 41 54 20 12", HEX_FORMAT
9830: 7c 20 54 59 50 45 5f 4d 44 29 3b 0a 7d 0a 0a 2f | TYPE_MD);.}../
9840: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
9850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9880: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
9890: 73 5f 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 73 s_DigestCommands
98a0: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65 --. *. *.Create
98b0: 20 64 69 67 65 73 74 20 63 6f 6d 6d 61 6e 64 73 digest commands
98c0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a . *. * Returns:.
98d0: 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c *.TCL_OK or TCL
98e0: 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 _ERROR. *. * Sid
98f0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 72 e effects:. *.Cr
9900: 65 61 74 65 73 20 63 6f 6d 6d 61 6e 64 73 0a 20 eates commands.
9910: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
9920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9950: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 -------. */.int
9960: 54 6c 73 5f 44 69 67 65 73 74 43 6f 6d 6d 61 6e Tls_DigestComman
9970: 64 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 ds(Tcl_Interp *i
9980: 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 54 63 6c nterp) {. Tcl
9990: 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e _CreateObjComman
99a0: 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a d(interp, "tls::
99b0: 64 69 67 65 73 74 22 2c 20 4d 64 4f 62 6a 43 6d digest", MdObjCm
99c0: 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
99d0: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
99e0: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
99f0: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
9a00: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
9a10: 20 22 74 6c 73 3a 3a 6d 64 22 2c 20 4d 64 4f 62 "tls::md", MdOb
9a20: 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
9a30: 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 a) 0, (Tcl_CmdDe
9a40: 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
9a50: 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 );. Tcl_Creat
9a60: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
9a70: 72 70 2c 20 22 74 6c 73 3a 3a 63 6d 61 63 22 2c rp, "tls::cmac",
9a80: 20 43 4d 41 43 4f 62 6a 43 6d 64 2c 20 28 43 6c CMACObjCmd, (Cl
9a90: 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
9aa0: 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
9ab0: 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
9ac0: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
9ad0: 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
9ae0: 3a 68 6d 61 63 22 2c 20 48 4d 41 43 4f 62 6a 43 :hmac", HMACObjC
9af0: 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 md, (ClientData)
9b00: 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 0, (Tcl_CmdDele
9b10: 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b teProc *) NULL);
9b20: 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f . Tcl_CreateO
9b30: 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 bjCommand(interp
9b40: 2c 20 22 74 6c 73 3a 3a 6d 61 63 22 2c 20 4d 41 , "tls::mac", MA
9b50: 43 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 CObjCmd, (Client
9b60: 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d Data) 0, (Tcl_Cm
9b70: 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
9b80: 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
9b90: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
9ba0: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 64 34 nterp, "tls::md4
9bb0: 22 2c 20 4d 44 34 4f 62 6a 43 6d 64 2c 20 28 43 ", MD4ObjCmd, (C
9bc0: 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 lientData) 0, (T
9bd0: 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 cl_CmdDeleteProc
9be0: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 *) NULL);. T
9bf0: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
9c00: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
9c10: 3a 3a 6d 64 35 22 2c 20 4d 44 35 4f 62 6a 43 6d ::md5", MD5ObjCm
9c20: 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
9c30: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
9c40: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
9c50: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
9c60: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
9c70: 20 22 74 6c 73 3a 3a 73 68 61 31 22 2c 20 53 48 "tls::sha1", SH
9c80: 41 31 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e A1ObjCmd, (Clien
9c90: 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
9ca0: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
9cb0: 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 NULL);. Tcl_C
9cc0: 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 reateObjCommand(
9cd0: 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 68 interp, "tls::sh
9ce0: 61 32 35 36 22 2c 20 53 48 41 32 35 36 4f 62 6a a256", SHA256Obj
9cf0: 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 Cmd, (ClientData
9d00: 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c ) 0, (Tcl_CmdDel
9d10: 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 eteProc *) NULL)
9d20: 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 ;. Tcl_Create
9d30: 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 ObjCommand(inter
9d40: 70 2c 20 22 74 6c 73 3a 3a 73 68 61 35 31 32 22 p, "tls::sha512"
9d50: 2c 20 53 48 41 35 31 32 4f 62 6a 43 6d 64 2c 20 , SHA512ObjCmd,
9d60: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 (ClientData) 0,
9d70: 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
9d80: 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
9d90: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
9da0: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
9db0: 6c 73 3a 3a 75 6e 73 74 61 63 6b 22 2c 20 44 69 ls::unstack", Di
9dc0: 67 65 73 74 55 6e 73 74 61 63 6b 4f 62 6a 43 6d gestUnstackObjCm
9dd0: 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
9de0: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
9df0: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
9e00: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
9e10: 4b 3b 0a 7d 0a 0a K;.}..