0000: 2f 2a 0a 20 2a 20 4d 65 73 73 61 67 65 20 44 69 /*. * Message Di
0010: 67 65 73 74 73 20 4d 6f 64 75 6c 65 0a 20 2a 0a gests Module. *.
0020: 20 2a 20 50 72 6f 76 69 64 65 73 20 63 6f 6d 6d * Provides comm
0030: 61 6e 64 73 20 74 6f 20 63 61 6c 63 75 6c 61 74 ands to calculat
0040: 65 20 61 20 6d 65 73 73 61 67 65 20 64 69 67 65 e a message dige
0050: 73 74 20 75 73 69 6e 67 20 61 20 73 70 65 63 69 st using a speci
0060: 66 69 65 64 20 68 61 73 68 20 66 75 6e 63 74 69 fied hash functi
0070: 6f 6e 2e 0a 20 2a 0a 20 2a 20 43 6f 70 79 72 69 on.. *. * Copyri
0080: 67 68 74 20 28 43 29 20 32 30 32 33 20 42 72 69 ght (C) 2023 Bri
0090: 61 6e 20 4f 27 48 61 67 61 6e 0a 20 2a 0a 20 2a an O'Hagan. *. *
00a0: 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 /..#include "tls
00b0: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 Int.h".#include
00c0: 22 74 63 6c 4f 70 74 73 2e 68 22 0a 23 69 6e 63 "tclOpts.h".#inc
00d0: 6c 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 23 69 6e lude <tcl.h>.#in
00e0: 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a clude <stdio.h>.
00f0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67 #include <string
0100: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70 .h>.#include <op
0110: 65 6e 73 73 6c 2f 65 76 70 2e 68 3e 0a 23 69 6e enssl/evp.h>.#in
0120: 63 6c 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 63 clude <openssl/c
0130: 6d 61 63 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 mac.h>.#include
0140: 3c 6f 70 65 6e 73 73 6c 2f 68 6d 61 63 2e 68 3e <openssl/hmac.h>
0150: 0a 0a 2f 2a 20 43 6f 6e 73 74 61 6e 74 73 20 2a ../* Constants *
0160: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 68 65 /.const char *he
0170: 78 20 3d 20 22 30 31 32 33 34 35 36 37 38 39 61 x = "0123456789a
0180: 62 63 64 65 66 22 3b 0a 0a 2f 2a 20 4d 61 63 72 bcdef";../* Macr
0190: 6f 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 42 55 os */.#define BU
01a0: 46 46 45 52 5f 53 49 5a 45 20 36 35 35 33 36 0a FFER_SIZE 65536.
01b0: 23 64 65 66 69 6e 65 20 43 48 41 4e 5f 45 4f 46 #define CHAN_EOF
01c0: 20 30 78 31 30 0a 0a 2f 2a 20 44 69 67 65 73 74 0x10../* Digest
01d0: 20 66 6f 72 6d 61 74 20 61 6e 64 20 6f 70 65 72 format and oper
01e0: 61 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 ation */.#define
01f0: 20 42 49 4e 5f 46 4f 52 4d 41 54 20 30 78 30 31 BIN_FORMAT 0x01
0200: 0a 23 64 65 66 69 6e 65 20 48 45 58 5f 46 4f 52 .#define HEX_FOR
0210: 4d 41 54 20 30 78 30 32 0a 23 64 65 66 69 6e 65 MAT 0x02.#define
0220: 20 54 59 50 45 5f 4d 44 20 20 20 20 30 78 31 30 TYPE_MD 0x10
0230: 0a 23 64 65 66 69 6e 65 20 54 59 50 45 5f 48 4d .#define TYPE_HM
0240: 41 43 20 20 30 78 32 30 0a 23 64 65 66 69 6e 65 AC 0x20.#define
0250: 20 54 59 50 45 5f 43 4d 41 43 20 20 30 78 34 30 TYPE_CMAC 0x40
0260: 0a 0a 2f 2a 0a 20 2a 20 54 68 69 73 20 73 74 72 ../*. * This str
0270: 75 63 74 75 72 65 20 64 65 66 69 6e 65 73 20 74 ucture defines t
0280: 68 65 20 70 65 72 2d 69 6e 73 74 61 6e 63 65 20 he per-instance
0290: 73 74 61 74 65 20 6f 66 20 61 20 64 69 67 65 73 state of a diges
02a0: 74 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 2a 2f t operation.. */
02b0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 .typedef struct
02c0: 44 69 67 65 73 74 53 74 61 74 65 20 7b 0a 09 54 DigestState {..T
02d0: 63 6c 5f 43 68 61 6e 6e 65 6c 20 73 65 6c 66 3b cl_Channel self;
02e0: 09 2f 2a 20 54 68 69 73 20 73 6f 63 6b 65 74 20 ./* This socket
02f0: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 09 54 63 6c 5f channel */..Tcl_
0300: 54 69 6d 65 72 54 6f 6b 65 6e 20 74 69 6d 65 72 TimerToken timer
0310: 3b 09 2f 2a 20 54 69 6d 65 72 20 66 6f 72 20 72 ;./* Timer for r
0320: 65 61 64 20 65 76 65 6e 74 73 20 2a 2f 0a 0a 09 ead events */...
0330: 69 6e 74 20 66 6c 61 67 73 3b 09 09 2f 2a 20 43 int flags;../* C
0340: 68 61 6e 20 63 6f 6e 66 69 67 20 66 6c 61 67 73 han config flags
0350: 20 2a 2f 0a 09 69 6e 74 20 77 61 74 63 68 4d 61 */..int watchMa
0360: 73 6b 3b 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 sk;../* Current
0370: 57 61 74 63 68 50 72 6f 63 20 6d 61 73 6b 20 2a WatchProc mask *
0380: 2f 0a 09 69 6e 74 20 6d 6f 64 65 3b 09 09 2f 2a /..int mode;../*
0390: 20 43 75 72 72 65 6e 74 20 6d 6f 64 65 20 6f 66 Current mode of
03a0: 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20 parent channel
03b0: 2a 2f 0a 09 69 6e 74 20 66 6f 72 6d 61 74 3b 09 */..int format;.
03c0: 09 2f 2a 20 44 69 67 65 73 74 20 66 6f 72 6d 61 ./* Digest forma
03d0: 74 20 61 6e 64 20 6f 70 65 72 61 74 69 6f 6e 20 t and operation
03e0: 2a 2f 0a 0a 09 54 63 6c 5f 49 6e 74 65 72 70 20 */...Tcl_Interp
03f0: 2a 69 6e 74 65 72 70 3b 09 2f 2a 20 43 75 72 72 *interp;./* Curr
0400: 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 20 ent interpreter
0410: 2a 2f 0a 09 45 56 50 5f 4d 44 5f 43 54 58 20 2a */..EVP_MD_CTX *
0420: 63 74 78 3b 09 2f 2a 20 4d 44 20 43 6f 6e 74 65 ctx;./* MD Conte
0430: 78 74 20 2a 2f 0a 09 48 4d 41 43 5f 43 54 58 20 xt */..HMAC_CTX
0440: 2a 68 63 74 78 3b 09 09 2f 2a 20 48 4d 41 43 20 *hctx;../* HMAC
0450: 43 6f 6e 74 65 78 74 20 2a 2f 0a 09 43 4d 41 43 Context */..CMAC
0460: 5f 43 54 58 20 2a 63 63 74 78 3b 09 09 2f 2a 20 _CTX *cctx;../*
0470: 43 4d 41 43 20 43 6f 6e 74 65 78 74 20 2a 2f 0a CMAC Context */.
0480: 09 54 63 6c 5f 43 6f 6d 6d 61 6e 64 20 74 6f 6b .Tcl_Command tok
0490: 65 6e 3b 09 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74 en;./* Command t
04a0: 6f 6b 65 6e 20 2a 2f 0a 7d 20 44 69 67 65 73 74 oken */.} Digest
04b0: 53 74 61 74 65 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d State;../*. *---
04c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0500: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73 . *. * Tls_Diges
0510: 74 4e 65 77 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 tNew --. *. *.Th
0520: 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 72 65 61 is function crea
0530: 74 65 73 20 61 20 64 69 67 65 73 74 20 73 74 61 tes a digest sta
0540: 74 65 20 73 74 72 75 63 74 75 72 65 0a 20 2a 0a te structure. *.
0550: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 44 * Returns:. *.D
0560: 69 67 65 73 74 20 73 74 72 75 63 74 75 72 65 20 igest structure
0570: 70 6f 69 6e 74 65 72 0a 20 2a 0a 20 2a 20 53 69 pointer. *. * Si
0580: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 de effects:. *.C
0590: 72 65 61 74 65 73 20 73 74 72 75 63 74 75 72 65 reates structure
05a0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
05b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
05e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 69 ---------. */.Di
05f0: 67 65 73 74 53 74 61 74 65 20 2a 54 6c 73 5f 44 gestState *Tls_D
0600: 69 67 65 73 74 4e 65 77 28 54 63 6c 5f 49 6e 74 igestNew(Tcl_Int
0610: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
0620: 20 66 6f 72 6d 61 74 29 20 7b 0a 20 20 20 20 44 format) {. D
0630: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 igestState *stat
0640: 65 50 74 72 3b 0a 0a 20 20 20 20 73 74 61 74 65 ePtr;.. state
0650: 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 Ptr = (DigestSta
0660: 74 65 20 2a 29 20 63 6b 61 6c 6c 6f 63 28 28 75 te *) ckalloc((u
0670: 6e 73 69 67 6e 65 64 29 20 73 69 7a 65 6f 66 28 nsigned) sizeof(
0680: 44 69 67 65 73 74 53 74 61 74 65 29 29 3b 0a 20 DigestState));.
0690: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 20 if (statePtr
06a0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6d 65 6d 73 != NULL) {..mems
06b0: 65 74 28 73 74 61 74 65 50 74 72 2c 20 30 2c 20 et(statePtr, 0,
06c0: 73 69 7a 65 6f 66 28 44 69 67 65 73 74 53 74 61 sizeof(DigestSta
06d0: 74 65 29 29 3b 0a 09 73 74 61 74 65 50 74 72 2d te));..statePtr-
06e0: 3e 73 65 6c 66 09 3d 20 4e 55 4c 4c 3b 09 09 2f >self.= NULL;../
06f0: 2a 20 54 68 69 73 20 73 6f 63 6b 65 74 20 63 68 * This socket ch
0700: 61 6e 6e 65 6c 20 2a 2f 0a 09 73 74 61 74 65 50 annel */..stateP
0710: 74 72 2d 3e 74 69 6d 65 72 20 3d 20 4e 55 4c 4c tr->timer = NULL
0720: 3b 09 09 2f 2a 20 54 69 6d 65 72 20 74 6f 20 66 ;../* Timer to f
0730: 6c 75 73 68 20 64 61 74 61 20 2a 2f 0a 09 73 74 lush data */..st
0740: 61 74 65 50 74 72 2d 3e 66 6c 61 67 73 20 3d 20 atePtr->flags =
0750: 30 3b 09 09 2f 2a 20 43 68 61 6e 20 63 6f 6e 66 0;../* Chan conf
0760: 69 67 20 66 6c 61 67 73 20 2a 2f 0a 09 73 74 61 ig flags */..sta
0770: 74 65 50 74 72 2d 3e 77 61 74 63 68 4d 61 73 6b tePtr->watchMask
0780: 20 3d 20 30 3b 09 2f 2a 20 43 75 72 72 65 6e 74 = 0;./* Current
0790: 20 57 61 74 63 68 50 72 6f 63 20 6d 61 73 6b 20 WatchProc mask
07a0: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 6d 6f */..statePtr->mo
07b0: 64 65 09 3d 20 30 3b 09 09 2f 2a 20 43 75 72 72 de.= 0;../* Curr
07c0: 65 6e 74 20 6d 6f 64 65 20 6f 66 20 70 61 72 65 ent mode of pare
07d0: 6e 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 09 73 nt channel */..s
07e0: 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 tatePtr->format
07f0: 3d 20 66 6f 72 6d 61 74 3b 09 2f 2a 20 44 69 67 = format;./* Dig
0800: 65 73 74 20 66 6f 72 6d 61 74 20 61 6e 64 20 6f est format and o
0810: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 09 73 74 61 peration */..sta
0820: 74 65 50 74 72 2d 3e 69 6e 74 65 72 70 20 3d 20 tePtr->interp =
0830: 69 6e 74 65 72 70 3b 09 2f 2a 20 43 75 72 72 65 interp;./* Curre
0840: 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 20 2a nt interpreter *
0850: 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 74 78 /..statePtr->ctx
0860: 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 4d 44 20 = NULL;../* MD
0870: 43 6f 6e 74 65 78 74 20 2a 2f 0a 09 73 74 61 74 Context */..stat
0880: 65 50 74 72 2d 3e 68 63 74 78 20 3d 20 4e 55 4c ePtr->hctx = NUL
0890: 4c 3b 09 09 2f 2a 20 48 4d 41 43 20 43 6f 6e 74 L;../* HMAC Cont
08a0: 65 78 74 20 2a 2f 0a 09 73 74 61 74 65 50 74 72 ext */..statePtr
08b0: 2d 3e 63 63 74 78 20 3d 20 4e 55 4c 4c 3b 09 09 ->cctx = NULL;..
08c0: 2f 2a 20 43 4d 41 43 20 43 6f 6e 74 65 78 74 20 /* CMAC Context
08d0: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 6f */..statePtr->to
08e0: 6b 65 6e 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 ken = NULL;../*
08f0: 43 6f 6d 6d 61 6e 64 20 74 6f 6b 65 6e 20 2a 2f Command token */
0900: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
0910: 6e 20 73 74 61 74 65 50 74 72 3b 0a 7d 0a 0a 2f n statePtr;.}../
0920: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
0930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0960: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
0970: 73 5f 44 69 67 65 73 74 46 72 65 65 20 2d 2d 0a s_DigestFree --.
0980: 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 *. *.This funct
0990: 69 6f 6e 20 72 65 6d 6f 76 65 73 20 61 20 64 69 ion removes a di
09a0: 67 65 73 74 20 73 74 61 74 65 20 73 74 72 75 63 gest state struc
09b0: 74 75 72 65 0a 20 2a 0a 20 2a 20 52 65 74 75 72 ture. *. * Retur
09c0: 6e 73 3a 0a 20 2a 09 4e 6f 74 68 69 6e 67 0a 20 ns:. *.Nothing.
09d0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
09e0: 73 3a 0a 20 2a 09 52 65 6d 6f 76 65 73 20 73 74 s:. *.Removes st
09f0: 72 75 63 74 75 72 65 0a 20 2a 0a 20 2a 2d 2d 2d ructure. *. *---
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: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0a40: 0a 20 2a 2f 0a 76 6f 69 64 20 54 6c 73 5f 44 69 . */.void Tls_Di
0a50: 67 65 73 74 46 72 65 65 28 44 69 67 65 73 74 53 gestFree(DigestS
0a60: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 29 20 tate *statePtr)
0a70: 7b 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 {. if (stateP
0a80: 74 72 20 3d 3d 20 28 44 69 67 65 73 74 53 74 61 tr == (DigestSta
0a90: 74 65 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 te *) NULL) {..r
0aa0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 eturn;. }..
0ab0: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
0ac0: 63 74 78 20 21 3d 20 28 45 56 50 5f 4d 44 5f 43 ctx != (EVP_MD_C
0ad0: 54 58 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 45 TX *) NULL) {..E
0ae0: 56 50 5f 4d 44 5f 43 54 58 5f 66 72 65 65 28 73 VP_MD_CTX_free(s
0af0: 74 61 74 65 50 74 72 2d 3e 63 74 78 29 3b 0a 20 tatePtr->ctx);.
0b00: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 74 61 }. if (sta
0b10: 74 65 50 74 72 2d 3e 68 63 74 78 20 21 3d 20 28 tePtr->hctx != (
0b20: 48 4d 41 43 5f 43 54 58 20 2a 29 20 4e 55 4c 4c HMAC_CTX *) NULL
0b30: 29 20 7b 0a 09 48 4d 41 43 5f 43 54 58 5f 66 72 ) {..HMAC_CTX_fr
0b40: 65 65 28 73 74 61 74 65 50 74 72 2d 3e 68 63 74 ee(statePtr->hct
0b50: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 x);. }. if
0b60: 20 28 73 74 61 74 65 50 74 72 2d 3e 63 63 74 78 (statePtr->cctx
0b70: 20 21 3d 20 28 43 4d 41 43 5f 43 54 58 20 2a 29 != (CMAC_CTX *)
0b80: 20 4e 55 4c 4c 29 20 7b 0a 09 43 4d 41 43 5f 43 NULL) {..CMAC_C
0b90: 54 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 TX_free(statePtr
0ba0: 2d 3e 63 63 74 78 29 3b 0a 20 20 20 20 7d 0a 20 ->cctx);. }.
0bb0: 20 20 20 63 6b 66 72 65 65 28 73 74 61 74 65 50 ckfree(stateP
0bc0: 74 72 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a tr);.}../*******
0bd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0be0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f ************/../
0c10: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
0c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c50: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c -------. *. * Tl
0c60: 73 5f 44 69 67 65 73 74 49 6e 69 74 20 2d 2d 0a s_DigestInit --.
0c70: 20 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 *. *.Initialize
0c80: 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e a hash function
0c90: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a . *. * Returns:.
0ca0: 20 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 73 75 63 *.TCL_OK if suc
0cb0: 63 65 73 73 66 75 6c 20 6f 72 20 54 43 4c 5f 45 cessful or TCL_E
0cc0: 52 52 4f 52 20 66 6f 72 20 66 61 69 6c 75 72 65 RROR for failure
0cd0: 20 77 69 74 68 20 72 65 73 75 6c 74 20 73 65 74 with result set
0ce0: 0a 20 2a 09 74 6f 20 65 72 72 6f 72 20 6d 65 73 . *.to error mes
0cf0: 73 61 67 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 sage.. *. * Side
0d00: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 20 effects:. *.No
0d10: 72 65 73 75 6c 74 20 6f 72 20 65 72 72 6f 72 20 result or error
0d20: 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d message. *. *---
0d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0d70: 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f 44 69 67 . */.int Tls_Dig
0d80: 65 73 74 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 estInit(Tcl_Inte
0d90: 72 70 20 2a 69 6e 74 65 72 70 2c 20 44 69 67 65 rp *interp, Dige
0da0: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 stState *statePt
0db0: 72 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 r, const EVP_MD
0dc0: 2a 6d 64 2c 0a 09 63 6f 6e 73 74 20 45 56 50 5f *md,..const EVP_
0dd0: 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 2c 20 CIPHER *cipher,
0de0: 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 29 Tcl_Obj *keyObj)
0df0: 20 7b 0a 20 20 20 20 69 6e 74 20 6b 65 79 5f 6c {. int key_l
0e00: 65 6e 20 3d 20 30 2c 20 72 65 73 20 3d 20 30 3b en = 0, res = 0;
0e10: 0a 20 20 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 . const unsig
0e20: 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 3b 0a 0a ned char *key;..
0e30: 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 6d 65 /* Create me
0e40: 73 73 61 67 65 20 64 69 67 65 73 74 20 63 6f 6e ssage digest con
0e50: 74 65 78 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 text */. if (
0e60: 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 statePtr->format
0e70: 20 26 20 54 59 50 45 5f 4d 44 29 20 7b 0a 09 73 & TYPE_MD) {..s
0e80: 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 45 tatePtr->ctx = E
0e90: 56 50 5f 4d 44 5f 43 54 58 5f 6e 65 77 28 29 3b VP_MD_CTX_new();
0ea0: 0a 09 72 65 73 20 3d 20 28 73 74 61 74 65 50 74 ..res = (statePt
0eb0: 72 2d 3e 63 74 78 20 21 3d 20 4e 55 4c 4c 29 3b r->ctx != NULL);
0ec0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
0ed0: 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 statePtr->format
0ee0: 20 26 20 54 59 50 45 5f 48 4d 41 43 29 20 7b 0a & TYPE_HMAC) {.
0ef0: 09 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 20 .statePtr->hctx
0f00: 3d 20 48 4d 41 43 5f 43 54 58 5f 6e 65 77 28 29 = HMAC_CTX_new()
0f10: 3b 0a 09 72 65 73 20 3d 20 28 73 74 61 74 65 50 ;..res = (stateP
0f20: 74 72 2d 3e 68 63 74 78 20 21 3d 20 4e 55 4c 4c tr->hctx != NULL
0f30: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 );. } else if
0f40: 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d (statePtr->form
0f50: 61 74 20 26 20 54 59 50 45 5f 43 4d 41 43 29 20 at & TYPE_CMAC)
0f60: 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 63 63 74 {..statePtr->cct
0f70: 78 20 3d 20 43 4d 41 43 5f 43 54 58 5f 6e 65 77 x = CMAC_CTX_new
0f80: 28 29 3b 0a 09 72 65 73 20 3d 20 28 73 74 61 74 ();..res = (stat
0f90: 65 50 74 72 2d 3e 63 63 74 78 20 21 3d 20 4e 55 ePtr->cctx != NU
0fa0: 4c 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 LL);. }. i
0fb0: 66 20 28 21 72 65 73 29 20 7b 0a 09 54 63 6c 5f f (!res) {..Tcl_
0fc0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
0fd0: 65 72 70 2c 20 22 43 72 65 61 74 65 20 63 6f 6e erp, "Create con
0fe0: 74 65 78 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 text failed: ",
0ff0: 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b REASON(), NULL);
1000: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
1010: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
1020: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 68 61 73 * Initialize has
1030: 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 h function */.
1040: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
1050: 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 4d 44 format & TYPE_MD
1060: 29 20 7b 0a 09 72 65 73 20 3d 20 45 56 50 5f 44 ) {..res = EVP_D
1070: 69 67 65 73 74 49 6e 69 74 5f 65 78 28 73 74 61 igestInit_ex(sta
1080: 74 65 50 74 72 2d 3e 63 74 78 2c 20 6d 64 2c 20 tePtr->ctx, md,
1090: 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 NULL);. } els
10a0: 65 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e e if (statePtr->
10b0: 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 48 4d format & TYPE_HM
10c0: 41 43 29 20 7b 0a 09 6b 65 79 20 3d 20 54 63 6c AC) {..key = Tcl
10d0: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f _GetByteArrayFro
10e0: 6d 4f 62 6a 28 6b 65 79 4f 62 6a 2c 20 26 6b 65 mObj(keyObj, &ke
10f0: 79 5f 6c 65 6e 29 3b 0a 09 72 65 73 20 3d 20 48 y_len);..res = H
1100: 4d 41 43 5f 49 6e 69 74 5f 65 78 28 73 74 61 74 MAC_Init_ex(stat
1110: 65 50 74 72 2d 3e 68 63 74 78 2c 20 28 63 6f 6e ePtr->hctx, (con
1120: 73 74 20 76 6f 69 64 20 2a 29 20 6b 65 79 2c 20 st void *) key,
1130: 6b 65 79 5f 6c 65 6e 2c 20 6d 64 2c 20 4e 55 4c key_len, md, NUL
1140: 4c 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 L);. } else i
1150: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 f (statePtr->for
1160: 6d 61 74 20 26 20 54 59 50 45 5f 43 4d 41 43 29 mat & TYPE_CMAC)
1170: 20 7b 0a 09 6b 65 79 20 3d 20 54 63 6c 5f 47 65 {..key = Tcl_Ge
1180: 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 tByteArrayFromOb
1190: 6a 28 6b 65 79 4f 62 6a 2c 20 26 6b 65 79 5f 6c j(keyObj, &key_l
11a0: 65 6e 29 3b 0a 09 72 65 73 20 3d 20 43 4d 41 43 en);..res = CMAC
11b0: 5f 49 6e 69 74 28 73 74 61 74 65 50 74 72 2d 3e _Init(statePtr->
11c0: 63 63 74 78 2c 20 28 63 6f 6e 73 74 20 76 6f 69 cctx, (const voi
11d0: 64 20 2a 29 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 d *) key, key_le
11e0: 6e 2c 20 63 69 70 68 65 72 2c 20 4e 55 4c 4c 29 n, cipher, NULL)
11f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
1200: 21 72 65 73 29 20 7b 0a 09 54 63 6c 5f 41 70 70 !res) {..Tcl_App
1210: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
1220: 2c 20 22 49 6e 69 74 69 61 6c 69 7a 65 20 66 61 , "Initialize fa
1230: 69 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 iled: ", REASON(
1240: 29 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 ), NULL);..retur
1250: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
1260: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 }. return TC
1270: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d L_OK;.}../*. *--
1280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
12c0: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 -. *. * Tls_Dige
12d0: 73 74 55 70 64 61 74 65 20 2d 2d 0a 20 2a 0a 20 stUpdate --. *.
12e0: 2a 09 55 70 64 61 74 65 20 61 20 68 61 73 68 20 *.Update a hash
12f0: 66 75 6e 63 74 69 6f 6e 0a 20 2a 0a 20 2a 20 52 function. *. * R
1300: 65 74 75 72 6e 73 3a 0a 20 2a 09 31 20 69 66 20 eturns:. *.1 if
1310: 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 30 20 successful or 0
1320: 66 6f 72 20 66 61 69 6c 75 72 65 0a 20 2a 0a 20 for failure. *.
1330: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
1340: 20 2a 09 41 64 64 73 20 62 75 66 20 74 6f 20 68 *.Adds buf to h
1350: 61 73 68 20 66 75 6e 63 74 69 6f 6e 0a 20 2a 0a ash function. *.
1360: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
1370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13a0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 54 6c -----. */.int Tl
13b0: 73 5f 44 69 67 65 73 74 55 70 64 61 74 65 28 44 s_DigestUpdate(D
13c0: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 igestState *stat
13d0: 65 50 74 72 2c 20 63 68 61 72 20 2a 62 75 66 2c ePtr, char *buf,
13e0: 20 73 69 7a 65 5f 74 20 72 65 61 64 2c 20 69 6e size_t read, in
13f0: 74 20 73 68 6f 77 29 20 7b 0a 20 20 20 20 69 6e t show) {. in
1400: 74 20 72 65 73 20 3d 20 30 3b 0a 0a 20 20 20 20 t res = 0;..
1410: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6f if (statePtr->fo
1420: 72 6d 61 74 20 26 20 54 59 50 45 5f 4d 44 29 20 rmat & TYPE_MD)
1430: 7b 0a 09 72 65 73 20 3d 20 45 56 50 5f 44 69 67 {..res = EVP_Dig
1440: 65 73 74 55 70 64 61 74 65 28 73 74 61 74 65 50 estUpdate(stateP
1450: 74 72 2d 3e 63 74 78 2c 20 62 75 66 2c 20 72 65 tr->ctx, buf, re
1460: 61 64 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 ad);. } else
1470: 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6f if (statePtr->fo
1480: 72 6d 61 74 20 26 20 54 59 50 45 5f 48 4d 41 43 rmat & TYPE_HMAC
1490: 29 20 7b 0a 09 72 65 73 20 3d 20 48 4d 41 43 5f ) {..res = HMAC_
14a0: 55 70 64 61 74 65 28 73 74 61 74 65 50 74 72 2d Update(statePtr-
14b0: 3e 68 63 74 78 2c 20 62 75 66 2c 20 72 65 61 64 >hctx, buf, read
14c0: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 );. } else if
14d0: 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d (statePtr->form
14e0: 61 74 20 26 20 54 59 50 45 5f 43 4d 41 43 29 20 at & TYPE_CMAC)
14f0: 7b 0a 09 72 65 73 20 3d 20 43 4d 41 43 5f 55 70 {..res = CMAC_Up
1500: 64 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e 63 date(statePtr->c
1510: 63 74 78 2c 20 62 75 66 2c 20 72 65 61 64 29 3b ctx, buf, read);
1520: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 21 . }. if (!
1530: 72 65 73 20 26 26 20 73 68 6f 77 29 20 7b 0a 09 res && show) {..
1540: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
1550: 28 73 74 61 74 65 50 74 72 2d 3e 69 6e 74 65 72 (statePtr->inter
1560: 70 2c 20 22 55 70 64 61 74 65 20 66 61 69 6c 65 p, "Update faile
1570: 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 d: ", REASON(),
1580: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
1590: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
15a0: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a return res;.
15b0: 7d 0a 0a 2f 2a 0a 20 2a 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 2d 2d 0a 20 2a 0a 20 -----------. *.
1600: 2a 20 54 6c 73 5f 44 69 67 65 73 74 46 69 6e 69 * Tls_DigestFini
1610: 61 6c 69 7a 65 20 2d 2d 0a 20 2a 0a 20 2a 09 46 alize --. *. *.F
1620: 69 6e 61 6c 69 7a 65 20 61 20 68 61 73 68 20 66 inalize a hash f
1630: 75 6e 63 74 69 6f 6e 20 61 6e 64 20 67 65 6e 65 unction and gene
1640: 72 61 74 65 20 61 20 6d 65 73 73 61 67 65 20 64 rate a message d
1650: 69 67 65 73 74 0a 20 2a 0a 20 2a 20 52 65 74 75 igest. *. * Retu
1660: 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 rns:. *.TCL_OK i
1670: 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 f successful or
1680: 54 43 4c 5f 45 52 52 4f 52 20 66 6f 72 20 66 61 TCL_ERROR for fa
1690: 69 6c 75 72 65 20 77 69 74 68 20 72 65 73 75 6c ilure with resul
16a0: 74 20 73 65 74 0a 20 2a 09 74 6f 20 65 72 72 6f t set. *.to erro
16b0: 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a r message.. *. *
16c0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
16d0: 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f *.Sets result to
16e0: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 message digest
16f0: 66 6f 72 20 68 61 73 68 20 66 75 6e 63 74 69 6f for hash functio
1700: 6e 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6d 65 n or an error me
1710: 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d ssage.. *. *----
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 2d ----------------
1750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
1760: 20 2a 2f 0a 0a 69 6e 74 20 54 6c 73 5f 44 69 67 */..int Tls_Dig
1770: 65 73 74 46 69 6e 69 61 6c 69 7a 65 28 54 63 6c estFinialize(Tcl
1780: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
1790: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 DigestState *st
17a0: 61 74 65 50 74 72 29 20 7b 0a 20 20 20 20 75 6e atePtr) {. un
17b0: 73 69 67 6e 65 64 20 63 68 61 72 20 6d 64 5f 62 signed char md_b
17c0: 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 uf[EVP_MAX_MD_SI
17d0: 5a 45 5d 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 ZE];. unsigne
17e0: 64 20 69 6e 74 20 6d 64 5f 6c 65 6e 3b 0a 20 20 d int md_len;.
17f0: 20 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 0a int res = 0;..
1800: 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 /* Finalize
1810: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e hash function an
1820: 64 20 63 61 6c 63 75 6c 61 74 65 20 6d 65 73 73 d calculate mess
1830: 61 67 65 20 64 69 67 65 73 74 20 2a 2f 0a 20 20 age digest */.
1840: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
1850: 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 4d 44 format & TYPE_MD
1860: 29 20 7b 0a 09 72 65 73 20 3d 20 45 56 50 5f 44 ) {..res = EVP_D
1870: 69 67 65 73 74 46 69 6e 61 6c 5f 65 78 28 73 74 igestFinal_ex(st
1880: 61 74 65 50 74 72 2d 3e 63 74 78 2c 20 6d 64 5f atePtr->ctx, md_
1890: 62 75 66 2c 20 26 6d 64 5f 6c 65 6e 29 3b 0a 20 buf, &md_len);.
18a0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 73 74 } else if (st
18b0: 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 atePtr->format &
18c0: 20 54 59 50 45 5f 48 4d 41 43 29 20 7b 0a 09 72 TYPE_HMAC) {..r
18d0: 65 73 20 3d 20 48 4d 41 43 5f 46 69 6e 61 6c 28 es = HMAC_Final(
18e0: 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 2c 20 statePtr->hctx,
18f0: 6d 64 5f 62 75 66 2c 20 26 6d 64 5f 6c 65 6e 29 md_buf, &md_len)
1900: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
1910: 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 (statePtr->forma
1920: 74 20 26 20 54 59 50 45 5f 43 4d 41 43 29 20 7b t & TYPE_CMAC) {
1930: 0a 09 73 69 7a 65 5f 74 20 6c 65 6e 3b 0a 09 72 ..size_t len;..r
1940: 65 73 20 3d 20 43 4d 41 43 5f 46 69 6e 61 6c 28 es = CMAC_Final(
1950: 73 74 61 74 65 50 74 72 2d 3e 63 63 74 78 2c 20 statePtr->cctx,
1960: 6d 64 5f 62 75 66 2c 20 26 6c 65 6e 29 3b 0a 09 md_buf, &len);..
1970: 6d 64 5f 6c 65 6e 20 3d 20 28 75 6e 73 69 67 6e md_len = (unsign
1980: 65 64 20 69 6e 74 29 20 6c 65 6e 3b 0a 20 20 20 ed int) len;.
1990: 20 7d 0a 20 20 20 20 69 66 20 28 21 72 65 73 29 }. if (!res)
19a0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 {..Tcl_AppendRe
19b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 46 69 sult(interp, "Fi
19c0: 6e 61 6c 69 7a 65 20 66 61 69 6c 65 64 3a 20 22 nalize failed: "
19d0: 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c , REASON(), NULL
19e0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
19f0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
1a00: 20 2f 2a 20 52 65 74 75 72 6e 20 6d 65 73 73 61 /* Return messa
1a10: 67 65 20 64 69 67 65 73 74 20 61 73 20 65 69 74 ge digest as eit
1a20: 68 65 72 20 61 20 62 69 6e 61 72 79 20 6f 72 20 her a binary or
1a30: 68 65 78 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 hex string */.
1a40: 20 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e if (statePtr->
1a50: 66 6f 72 6d 61 74 20 26 20 42 49 4e 5f 46 4f 52 format & BIN_FOR
1a60: 4d 41 54 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f MAT) {..Tcl_SetO
1a70: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
1a80: 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 Tcl_NewByteArra
1a90: 79 4f 62 6a 28 6d 64 5f 62 75 66 2c 20 6d 64 5f yObj(md_buf, md_
1aa0: 6c 65 6e 29 29 3b 0a 0a 20 20 20 20 7d 20 65 6c len));.. } el
1ab0: 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 72 se {..Tcl_Obj *r
1ac0: 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e esultObj = Tcl_N
1ad0: 65 77 4f 62 6a 28 29 3b 0a 09 75 6e 73 69 67 6e ewObj();..unsign
1ae0: 65 64 20 63 68 61 72 20 2a 70 74 72 20 3d 20 54 ed char *ptr = T
1af0: 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c cl_SetByteArrayL
1b00: 65 6e 67 74 68 28 72 65 73 75 6c 74 4f 62 6a 2c ength(resultObj,
1b10: 20 6d 64 5f 6c 65 6e 2a 32 29 3b 0a 0a 09 66 6f md_len*2);...fo
1b20: 72 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 r (unsigned int
1b30: 69 20 3d 20 30 3b 20 69 20 3c 20 6d 64 5f 6c 65 i = 0; i < md_le
1b40: 6e 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 2a n; i++) {.. *
1b50: 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 6d 64 5f ptr++ = hex[(md_
1b60: 62 75 66 5b 69 5d 20 3e 3e 20 34 29 20 26 20 30 buf[i] >> 4) & 0
1b70: 78 30 46 5d 3b 0a 09 20 20 20 20 2a 70 74 72 2b x0F];.. *ptr+
1b80: 2b 20 3d 20 68 65 78 5b 6d 64 5f 62 75 66 5b 69 + = hex[md_buf[i
1b90: 5d 20 26 20 30 78 30 46 5d 3b 0a 09 7d 0a 09 54 ] & 0x0F];..}..T
1ba0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
1bb0: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 interp, resultOb
1bc0: 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 j);. }. re
1bd0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a turn TCL_OK;.}..
1be0: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /***************
1bf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1c00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1c10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1c20: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d ****/../*. *----
1c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
1c70: 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73 74 *. * Tls_Digest
1c80: 46 69 6c 65 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 File --. *. *.Re
1c90: 74 75 72 6e 20 6d 65 73 73 61 67 65 20 64 69 67 turn message dig
1ca0: 65 73 74 20 66 6f 72 20 66 69 6c 65 20 75 73 69 est for file usi
1cb0: 6e 67 20 75 73 65 72 20 73 70 65 63 69 66 69 65 ng user specifie
1cc0: 64 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e d hash function.
1cd0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a . *. * Returns:.
1ce0: 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c *.TCL_OK or TCL
1cf0: 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 _ERROR. *. * Sid
1d00: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 52 65 e effects:. *.Re
1d10: 73 75 6c 74 20 69 73 20 6d 65 73 73 61 67 65 20 sult is message
1d20: 64 69 67 65 73 74 20 6f 72 20 65 72 72 6f 72 20 digest or error
1d30: 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d message. *. *---
1d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1d80: 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f 44 69 67 . */.int Tls_Dig
1d90: 65 73 74 46 69 6c 65 28 54 63 6c 5f 49 6e 74 65 estFile(Tcl_Inte
1da0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f rp *interp, Tcl_
1db0: 4f 62 6a 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 63 Obj *filename, c
1dc0: 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 2c onst EVP_MD *md,
1dd0: 0a 09 63 6f 6e 73 74 20 45 56 50 5f 43 49 50 48 ..const EVP_CIPH
1de0: 45 52 20 2a 63 69 70 68 65 72 2c 20 69 6e 74 20 ER *cipher, int
1df0: 66 6f 72 6d 61 74 2c 20 54 63 6c 5f 4f 62 6a 20 format, Tcl_Obj
1e00: 2a 6b 65 79 4f 62 6a 29 20 7b 0a 20 20 20 20 44 *keyObj) {. D
1e10: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 igestState *stat
1e20: 65 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 43 68 ePtr;. Tcl_Ch
1e30: 61 6e 6e 65 6c 20 63 68 61 6e 20 3d 20 4e 55 4c annel chan = NUL
1e40: 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 L;. unsigned
1e50: 63 68 61 72 20 62 75 66 5b 42 55 46 46 45 52 5f char buf[BUFFER_
1e60: 53 49 5a 45 5d 3b 0a 20 20 20 20 69 6e 74 20 72 SIZE];. int r
1e70: 65 73 20 3d 20 54 43 4c 5f 4f 4b 2c 20 6c 65 6e es = TCL_OK, len
1e80: 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 66 ;.. /* Open f
1e90: 69 6c 65 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 ile channel */.
1ea0: 20 20 20 63 68 61 6e 20 3d 20 54 63 6c 5f 46 53 chan = Tcl_FS
1eb0: 4f 70 65 6e 46 69 6c 65 43 68 61 6e 6e 65 6c 28 OpenFileChannel(
1ec0: 69 6e 74 65 72 70 2c 20 66 69 6c 65 6e 61 6d 65 interp, filename
1ed0: 2c 20 22 72 62 22 2c 20 30 34 34 34 29 3b 0a 20 , "rb", 0444);.
1ee0: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 if (chan == (
1ef0: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
1f00: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
1f10: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
1f20: 20 20 20 2f 2a 20 43 6f 6e 66 69 67 75 72 65 20 /* Configure
1f30: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 channel */. i
1f40: 66 20 28 28 72 65 73 20 3d 20 54 63 6c 5f 53 65 f ((res = Tcl_Se
1f50: 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 tChannelOption(i
1f60: 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 nterp, chan, "-t
1f70: 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 ranslation", "bi
1f80: 6e 61 72 79 22 29 29 20 3d 3d 20 54 43 4c 5f 45 nary")) == TCL_E
1f90: 52 52 4f 52 29 20 7b 0a 09 67 6f 74 6f 20 64 6f RROR) {..goto do
1fa0: 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 ne;. }. Tc
1fb0: 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 42 75 66 66 l_SetChannelBuff
1fc0: 65 72 53 69 7a 65 28 63 68 61 6e 2c 20 42 55 46 erSize(chan, BUF
1fd0: 46 45 52 5f 53 49 5a 45 29 3b 0a 0a 20 20 20 20 FER_SIZE);..
1fe0: 2f 2a 20 43 72 65 61 74 65 20 73 74 61 74 65 20 /* Create state
1ff0: 64 61 74 61 20 73 74 72 75 63 74 20 2a 2f 0a 20 data struct */.
2000: 20 20 20 69 66 20 28 28 73 74 61 74 65 50 74 72 if ((statePtr
2010: 20 3d 20 54 6c 73 5f 44 69 67 65 73 74 4e 65 77 = Tls_DigestNew
2020: 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74 29 (interp, format)
2030: 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 ) == NULL) {..Tc
2040: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
2050: 6e 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20 61 nterp, "Memory a
2060: 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 22 llocation error"
2070: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
2080: 3b 0a 09 72 65 73 20 3d 20 54 43 4c 5f 45 52 52 ;..res = TCL_ERR
2090: 4f 52 3b 0a 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a OR;..goto done;.
20a0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e }.. /* In
20b0: 69 74 69 61 6c 69 7a 65 20 68 61 73 68 20 66 75 itialize hash fu
20c0: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 nction */. if
20d0: 20 28 28 72 65 73 20 3d 20 54 6c 73 5f 44 69 67 ((res = Tls_Dig
20e0: 65 73 74 49 6e 69 74 28 69 6e 74 65 72 70 2c 20 estInit(interp,
20f0: 73 74 61 74 65 50 74 72 2c 20 6d 64 2c 20 63 69 statePtr, md, ci
2100: 70 68 65 72 2c 20 6b 65 79 4f 62 6a 29 29 20 21 pher, keyObj)) !
2110: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 67 6f 74 = TCL_OK) {..got
2120: 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 0a 20 o done;. }..
2130: 20 20 20 2f 2a 20 52 65 61 64 20 66 69 6c 65 20 /* Read file
2140: 64 61 74 61 20 61 6e 64 20 75 70 64 61 74 65 20 data and update
2150: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f hash function */
2160: 0a 20 20 20 20 77 68 69 6c 65 20 28 21 54 63 6c . while (!Tcl
2170: 5f 45 6f 66 28 63 68 61 6e 29 29 20 7b 0a 09 6c _Eof(chan)) {..l
2180: 65 6e 20 3d 20 54 63 6c 5f 52 65 61 64 52 61 77 en = Tcl_ReadRaw
2190: 28 63 68 61 6e 2c 20 28 63 68 61 72 20 2a 29 20 (chan, (char *)
21a0: 62 75 66 2c 20 42 55 46 46 45 52 5f 53 49 5a 45 buf, BUFFER_SIZE
21b0: 29 3b 0a 09 69 66 20 28 6c 65 6e 20 3e 20 30 29 );..if (len > 0)
21c0: 20 7b 0a 09 20 20 20 20 69 66 20 28 21 54 6c 73 {.. if (!Tls
21d0: 5f 44 69 67 65 73 74 55 70 64 61 74 65 28 73 74 _DigestUpdate(st
21e0: 61 74 65 50 74 72 2c 20 26 62 75 66 5b 30 5d 2c atePtr, &buf[0],
21f0: 20 28 73 69 7a 65 5f 74 29 20 6c 65 6e 2c 20 31 (size_t) len, 1
2200: 29 29 20 7b 0a 09 09 72 65 73 20 3d 20 54 43 4c )) {...res = TCL
2210: 5f 45 52 52 4f 52 3b 0a 09 09 67 6f 74 6f 20 64 _ERROR;...goto d
2220: 6f 6e 65 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 one;.. }..}.
2230: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 6e }.. /* Fin
2240: 61 6c 69 7a 65 20 68 61 73 68 20 66 75 6e 63 74 alize hash funct
2250: 69 6f 6e 20 61 6e 64 20 63 61 6c 63 75 6c 61 74 ion and calculat
2260: 65 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 e message digest
2270: 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 54 6c */. res = Tl
2280: 73 5f 44 69 67 65 73 74 46 69 6e 69 61 6c 69 7a s_DigestFinializ
2290: 65 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 e(interp, stateP
22a0: 74 72 29 3b 0a 0a 64 6f 6e 65 3a 0a 20 20 20 20 tr);..done:.
22b0: 2f 2a 20 43 6c 6f 73 65 20 63 68 61 6e 6e 65 6c /* Close channel
22c0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f */. if (Tcl_
22d0: 43 6c 6f 73 65 28 69 6e 74 65 72 70 2c 20 63 68 Close(interp, ch
22e0: 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 an) == TCL_ERROR
22f0: 29 20 7b 0a 09 72 65 73 20 3d 20 54 43 4c 5f 45 ) {..res = TCL_E
2300: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
2310: 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 20 2a 2f 0a /* Clean-up */.
2320: 20 20 20 20 54 6c 73 5f 44 69 67 65 73 74 46 72 Tls_DigestFr
2330: 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a 20 20 ee(statePtr);.
2340: 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a return res;.}.
2350: 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ./**************
2360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
2390: 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d *****/../*. *---
23a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23e0: 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 42 6c 6f . *. * DigestBlo
23f0: 63 6b 4d 6f 64 65 50 72 6f 63 20 2d 2d 0a 20 2a ckModeProc --. *
2400: 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f . *.This functio
2410: 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 79 20 n is invoked by
2420: 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f 20 6c the generic IO l
2430: 65 76 65 6c 0a 20 2a 20 20 20 20 20 20 20 74 6f evel. * to
2440: 20 73 65 74 20 62 6c 6f 63 6b 69 6e 67 20 61 6e set blocking an
2450: 64 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f d nonblocking mo
2460: 64 65 73 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 des.. *. * Retur
2470: 6e 73 3a 0a 20 2a 09 30 20 69 66 20 73 75 63 63 ns:. *.0 if succ
2480: 65 73 73 66 75 6c 20 6f 72 20 50 4f 53 49 58 20 essful or POSIX
2490: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 66 61 error code if fa
24a0: 69 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 iled.. *. * Side
24b0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 effects:. *.Set
24c0: 73 20 74 68 65 20 64 65 76 69 63 65 20 69 6e 74 s the device int
24d0: 6f 20 62 6c 6f 63 6b 69 6e 67 20 6f 72 20 6e 6f o blocking or no
24e0: 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2e 0a nblocking mode..
24f0: 20 2a 09 43 61 6e 20 63 61 6c 6c 20 54 63 6c 5f *.Can call Tcl_
2500: 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 6f 72 2e SetChannelError.
2510: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
2520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
2560: 61 74 69 63 20 69 6e 74 20 44 69 67 65 73 74 42 atic int DigestB
2570: 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 28 43 6c 69 lockModeProc(Cli
2580: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
2590: 74 61 2c 20 69 6e 74 20 6d 6f 64 65 29 20 7b 0a ta, int mode) {.
25a0: 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 DigestState
25b0: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 *statePtr = (Dig
25c0: 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 estState *) clie
25d0: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 ntData;.. if
25e0: 28 6d 6f 64 65 20 3d 3d 20 54 43 4c 5f 4d 4f 44 (mode == TCL_MOD
25f0: 45 5f 4e 4f 4e 42 4c 4f 43 4b 49 4e 47 29 20 7b E_NONBLOCKING) {
2600: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 ..statePtr->flag
2610: 73 20 7c 3d 20 54 4c 53 5f 54 43 4c 5f 41 53 59 s |= TLS_TCL_ASY
2620: 4e 43 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b NC;. } else {
2630: 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 67 ..statePtr->flag
2640: 73 20 26 3d 20 7e 28 54 4c 53 5f 54 43 4c 5f 41 s &= ~(TLS_TCL_A
2650: 53 59 4e 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 SYNC);. }.
2660: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a return 0;.}../*
2670: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
2680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26b0: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 ------. *. * Dig
26c0: 65 73 74 43 6c 6f 73 65 50 72 6f 63 20 2d 2d 0a estCloseProc --.
26d0: 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 *. *.This funct
26e0: 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 62 ion is invoked b
26f0: 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f y the generic IO
2700: 20 6c 65 76 65 6c 20 74 6f 20 70 65 72 66 6f 72 level to perfor
2710: 6d 0a 20 2a 09 63 68 61 6e 6e 65 6c 2d 74 79 70 m. *.channel-typ
2720: 65 2d 73 70 65 63 69 66 69 63 20 63 6c 65 61 6e e-specific clean
2730: 75 70 20 77 68 65 6e 20 63 68 61 6e 6e 65 6c 20 up when channel
2740: 69 73 20 63 6c 6f 73 65 64 2e 20 41 6c 6c 0a 20 is closed. All.
2750: 2a 09 71 75 65 75 65 64 20 6f 75 74 70 75 74 20 *.queued output
2760: 69 73 20 66 6c 75 73 68 65 64 20 70 72 69 6f 72 is flushed prior
2770: 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 to calling this
2780: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a function.. *. *
2790: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 30 20 69 Returns:. *.0 i
27a0: 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 f successful or
27b0: 50 4f 53 49 58 20 65 72 72 6f 72 20 63 6f 64 65 POSIX error code
27c0: 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 2a 0a 20 if failed.. *.
27d0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
27e0: 20 2a 09 57 72 69 74 65 73 20 64 69 67 65 73 74 *.Writes digest
27f0: 20 74 6f 20 6f 75 74 70 75 74 20 61 6e 64 20 63 to output and c
2800: 6c 6f 73 65 73 20 74 68 65 20 63 68 61 6e 6e 65 loses the channe
2810: 6c 2e 20 53 74 6f 72 65 73 20 65 72 72 6f 72 0a l. Stores error.
2820: 20 2a 09 6d 65 73 73 61 67 65 73 20 69 6e 20 69 *.messages in i
2830: 6e 74 65 72 70 20 72 65 73 75 6c 74 20 75 73 69 nterp result usi
2840: 6e 67 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 ng Tcl_GetChanne
2850: 6c 45 72 72 6f 72 49 6e 74 65 72 70 2e 0a 20 2a lErrorInterp.. *
2860: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
2870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28a0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 ------. */.int D
28b0: 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 28 43 igestCloseProc(C
28c0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
28d0: 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 Data, Tcl_Interp
28e0: 20 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 *interp) {.
28f0: 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 DigestState *sta
2900: 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 tePtr = (DigestS
2910: 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 tate *) clientDa
2920: 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 43 61 6e 63 ta;.. /* Canc
2930: 65 6c 20 61 63 74 69 76 65 20 74 69 6d 65 72 2c el active timer,
2940: 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 20 20 69 if any */. i
2950: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d f (statePtr->tim
2960: 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 er != (Tcl_Timer
2970: 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 Token) NULL) {..
2980: 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 Tcl_DeleteTimerH
2990: 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d andler(statePtr-
29a0: 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 >timer);..stateP
29b0: 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c tr->timer = (Tcl
29c0: 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c _TimerToken) NUL
29d0: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a L;. }.. /*
29e0: 20 43 6c 65 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 Clean-up */.
29f0: 20 54 6c 73 5f 44 69 67 65 73 74 46 72 65 65 28 Tls_DigestFree(
2a00: 73 74 61 74 65 50 74 72 29 3b 0a 20 20 20 20 72 statePtr);. r
2a10: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 eturn 0;.}../*.
2a20: 2a 20 53 61 6d 65 20 61 73 20 44 69 67 65 73 74 * Same as Digest
2a30: 43 6c 6f 73 65 50 72 6f 63 20 62 75 74 20 77 69 CloseProc but wi
2a40: 74 68 20 69 6e 64 69 76 69 64 75 61 6c 20 72 65 th individual re
2a50: 61 64 20 61 6e 64 20 77 72 69 74 65 20 63 6c 6f ad and write clo
2a60: 73 65 20 63 6f 6e 74 72 6f 6c 0a 20 2a 2f 0a 73 se control. */.s
2a70: 74 61 74 69 63 20 69 6e 74 20 44 69 67 65 73 74 tatic int Digest
2a80: 43 6c 6f 73 65 32 50 72 6f 63 28 43 6c 69 65 6e Close2Proc(Clien
2a90: 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 tData instanceDa
2aa0: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
2ab0: 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 6c 61 67 interp, int flag
2ac0: 73 29 20 7b 0a 0a 20 20 20 20 69 66 20 28 28 66 s) {.. if ((f
2ad0: 6c 61 67 73 20 26 20 28 54 43 4c 5f 43 4c 4f 53 lags & (TCL_CLOS
2ae0: 45 5f 52 45 41 44 20 7c 20 54 43 4c 5f 43 4c 4f E_READ | TCL_CLO
2af0: 53 45 5f 57 52 49 54 45 29 29 20 3d 3d 20 30 29 SE_WRITE)) == 0)
2b00: 20 7b 0a 09 72 65 74 75 72 6e 20 44 69 67 65 73 {..return Diges
2b10: 74 43 6c 6f 73 65 50 72 6f 63 28 69 6e 73 74 61 tCloseProc(insta
2b20: 6e 63 65 44 61 74 61 2c 20 69 6e 74 65 72 70 29 nceData, interp)
2b30: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 ;. }. retu
2b40: 72 6e 20 45 49 4e 56 41 4c 3b 0a 7d 0a 0a 2f 2a rn EINVAL;.}../*
2b50: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
2b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
2ba0: 44 69 67 65 73 74 49 6e 70 75 74 50 72 6f 63 20 DigestInputProc
2bb0: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 --. *. *.Called
2bc0: 62 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 by the generic I
2bd0: 4f 20 73 79 73 74 65 6d 20 74 6f 20 72 65 61 64 O system to read
2be0: 20 64 61 74 61 20 66 72 6f 6d 20 74 72 61 6e 73 data from trans
2bf0: 66 6f 72 6d 20 61 6e 64 0a 20 2a 09 70 6c 61 63 form and. *.plac
2c00: 65 20 69 6e 20 62 75 66 2e 0a 20 2a 0a 20 2a 20 e in buf.. *. *
2c10: 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 6f 74 61 Returns:. *.Tota
2c20: 6c 20 62 79 74 65 73 20 72 65 61 64 20 6f 72 20 l bytes read or
2c30: 2d 31 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 20 -1 for an error
2c40: 61 6c 6f 6e 67 20 77 69 74 68 20 61 20 50 4f 53 along with a POS
2c50: 49 58 20 65 72 72 6f 72 0a 20 2a 09 63 6f 64 65 IX error. *.code
2c60: 20 69 6e 20 65 72 72 6f 72 43 6f 64 65 50 74 72 in errorCodePtr
2c70: 2e 20 55 73 65 20 45 41 47 41 49 4e 20 66 6f 72 . Use EAGAIN for
2c80: 20 6e 6f 6e 62 6c 6f 63 6b 69 6e 67 20 61 6e 64 nonblocking and
2c90: 20 6e 6f 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 20 no data.. *. *
2ca0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
2cb0: 09 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 .Read data from
2cc0: 74 72 61 6e 73 66 6f 72 6d 20 61 6e 64 20 77 72 transform and wr
2cd0: 69 74 65 20 74 6f 20 62 75 66 0a 20 2a 0a 20 2a ite to buf. *. *
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 2d 2d ----------------
2d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d20: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 ------. */.int D
2d30: 69 67 65 73 74 49 6e 70 75 74 50 72 6f 63 28 43 igestInputProc(C
2d40: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
2d50: 44 61 74 61 2c 20 63 68 61 72 20 2a 62 75 66 2c Data, char *buf,
2d60: 20 69 6e 74 20 74 6f 52 65 61 64 2c 20 69 6e 74 int toRead, int
2d70: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 29 20 *errorCodePtr)
2d80: 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 {. DigestStat
2d90: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 e *statePtr = (D
2da0: 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c igestState *) cl
2db0: 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63 ientData;. Tc
2dc0: 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 l_Channel parent
2dd0: 3b 0a 20 20 20 20 69 6e 74 20 72 65 61 64 2c 20 ;. int read,
2de0: 72 65 73 20 3d 20 30 3b 0a 20 20 20 20 2a 65 72 res = 0;. *er
2df0: 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 30 3b 0a rorCodePtr = 0;.
2e00: 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 69 66 . /* Abort if
2e10: 20 6e 6f 74 68 69 6e 67 20 74 6f 20 70 72 6f 63 nothing to proc
2e20: 65 73 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 74 ess */. if (t
2e30: 6f 52 65 61 64 20 3c 3d 20 30 20 7c 7c 20 73 74 oRead <= 0 || st
2e40: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 atePtr->self ==
2e50: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
2e60: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b LL) {..return 0;
2e70: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 . }.. /* G
2e80: 65 74 20 62 79 74 65 73 20 66 72 6f 6d 20 75 6e et bytes from un
2e90: 64 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c derlying channel
2ea0: 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 20 3d */. parent =
2eb0: 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 Tcl_GetStackedC
2ec0: 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d hannel(statePtr-
2ed0: 3e 73 65 6c 66 29 3b 0a 20 20 20 20 72 65 61 64 >self);. read
2ee0: 20 3d 20 54 63 6c 5f 52 65 61 64 52 61 77 28 70 = Tcl_ReadRaw(p
2ef0: 61 72 65 6e 74 2c 20 62 75 66 2c 20 74 6f 52 65 arent, buf, toRe
2f00: 61 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 ad);.. /* Upd
2f10: 61 74 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f ate hash functio
2f20: 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 61 n */. if (rea
2f30: 64 20 3e 20 30 29 20 7b 0a 09 69 66 20 28 21 54 d > 0) {..if (!T
2f40: 6c 73 5f 44 69 67 65 73 74 55 70 64 61 74 65 28 ls_DigestUpdate(
2f50: 73 74 61 74 65 50 74 72 2c 20 62 75 66 2c 20 28 statePtr, buf, (
2f60: 73 69 7a 65 5f 74 29 20 72 65 61 64 2c 20 30 29 size_t) read, 0)
2f70: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 ) {.. Tcl_Set
2f80: 43 68 61 6e 6e 65 6c 45 72 72 6f 72 28 73 74 61 ChannelError(sta
2f90: 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 54 63 6c tePtr->self, Tcl
2fa0: 5f 4f 62 6a 50 72 69 6e 74 66 28 22 55 70 64 61 _ObjPrintf("Upda
2fb0: 74 65 20 66 61 69 6c 65 64 3a 20 25 73 22 2c 20 te failed: %s",
2fc0: 52 45 41 53 4f 4e 28 29 29 29 3b 0a 09 20 20 20 REASON()));..
2fd0: 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d *errorCodePtr =
2fe0: 20 45 49 4e 56 41 4c 3b 0a 09 20 20 20 20 72 65 EINVAL;.. re
2ff0: 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 09 2f 2a 20 turn -1;..}../*
3000: 54 68 69 73 20 69 73 20 63 6f 72 72 65 63 74 20 This is correct
3010: 2a 2f 0a 09 72 65 61 64 20 3d 20 2d 31 3b 0a 09 */..read = -1;..
3020: 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d 20 *errorCodePtr =
3030: 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 0a 20 20 EAGAIN;.. .
3040: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 72 65 61 } else if (rea
3050: 64 20 3c 20 30 29 20 7b 0a 09 2f 2a 20 45 72 72 d < 0) {../* Err
3060: 6f 72 20 2a 2f 0a 09 2a 65 72 72 6f 72 43 6f 64 or */..*errorCod
3070: 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 45 72 ePtr = Tcl_GetEr
3080: 72 6e 6f 28 29 3b 0a 0a 20 20 20 20 7d 20 65 6c rno();.. } el
3090: 73 65 20 69 66 20 28 21 28 73 74 61 74 65 50 74 se if (!(statePt
30a0: 72 2d 3e 66 6c 61 67 73 20 26 20 43 48 41 4e 5f r->flags & CHAN_
30b0: 45 4f 46 29 29 20 7b 0a 09 2f 2a 20 45 4f 46 20 EOF)) {../* EOF
30c0: 2a 2f 0a 09 75 6e 73 69 67 6e 65 64 20 63 68 61 */..unsigned cha
30d0: 72 20 6d 64 5f 62 75 66 5b 45 56 50 5f 4d 41 58 r md_buf[EVP_MAX
30e0: 5f 4d 44 5f 53 49 5a 45 5d 3b 0a 09 75 6e 73 69 _MD_SIZE];..unsi
30f0: 67 6e 65 64 20 69 6e 74 20 6d 64 5f 6c 65 6e 20 gned int md_len
3100: 3d 20 30 3b 0a 0a 09 2f 2a 20 46 69 6e 61 6c 69 = 0;.../* Finali
3110: 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e ze hash function
3120: 20 61 6e 64 20 63 61 6c 63 75 6c 61 74 65 20 6d and calculate m
3130: 65 73 73 61 67 65 20 64 69 67 65 73 74 20 2a 2f essage digest */
3140: 0a 09 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e ..if (statePtr->
3150: 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 4d 44 format & TYPE_MD
3160: 29 20 7b 0a 09 20 20 20 20 72 65 73 20 3d 20 45 ) {.. res = E
3170: 56 50 5f 44 69 67 65 73 74 46 69 6e 61 6c 5f 65 VP_DigestFinal_e
3180: 78 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 2c x(statePtr->ctx,
3190: 20 6d 64 5f 62 75 66 2c 20 26 6d 64 5f 6c 65 6e md_buf, &md_len
31a0: 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 73 );..} else if (s
31b0: 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 tatePtr->format
31c0: 26 20 54 59 50 45 5f 48 4d 41 43 29 20 7b 0a 09 & TYPE_HMAC) {..
31d0: 20 20 20 20 72 65 73 20 3d 20 48 4d 41 43 5f 46 res = HMAC_F
31e0: 69 6e 61 6c 28 73 74 61 74 65 50 74 72 2d 3e 68 inal(statePtr->h
31f0: 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26 6d 64 ctx, md_buf, &md
3200: 5f 6c 65 6e 29 3b 0a 09 7d 20 65 6c 73 65 20 69 _len);..} else i
3210: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 f (statePtr->for
3220: 6d 61 74 20 26 20 54 59 50 45 5f 43 4d 41 43 29 mat & TYPE_CMAC)
3230: 20 7b 0a 09 20 20 20 20 73 69 7a 65 5f 74 20 6c {.. size_t l
3240: 65 6e 3b 0a 09 20 20 20 20 72 65 73 20 3d 20 43 en;.. res = C
3250: 4d 41 43 5f 46 69 6e 61 6c 28 73 74 61 74 65 50 MAC_Final(stateP
3260: 74 72 2d 3e 63 63 74 78 2c 20 6d 64 5f 62 75 66 tr->cctx, md_buf
3270: 2c 20 26 6c 65 6e 29 3b 0a 09 20 20 20 20 6d 64 , &len);.. md
3280: 5f 6c 65 6e 20 3d 20 28 75 6e 73 69 67 6e 65 64 _len = (unsigned
3290: 20 69 6e 74 29 20 6c 65 6e 3b 0a 09 7d 0a 09 69 int) len;..}..i
32a0: 66 20 28 21 72 65 73 29 20 7b 0a 09 20 20 20 20 f (!res) {..
32b0: 54 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72 Tcl_SetChannelEr
32c0: 72 6f 72 28 73 74 61 74 65 50 74 72 2d 3e 73 65 ror(statePtr->se
32d0: 6c 66 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 lf, Tcl_ObjPrint
32e0: 66 28 22 46 69 6e 61 6c 69 7a 65 20 66 61 69 6c f("Finalize fail
32f0: 65 64 3a 20 25 73 22 2c 20 52 45 41 53 4f 4e 28 ed: %s", REASON(
3300: 29 29 29 3b 0a 09 20 20 20 20 2a 65 72 72 6f 72 )));.. *error
3310: 43 6f 64 65 50 74 72 20 3d 20 45 49 4e 56 41 4c CodePtr = EINVAL
3320: 3b 0a 0a 09 2f 2a 20 57 72 69 74 65 20 6d 65 73 ;.../* Write mes
3330: 73 61 67 65 20 64 69 67 65 73 74 20 74 6f 20 6f sage digest to o
3340: 75 74 70 75 74 20 63 68 61 6e 6e 65 6c 20 61 73 utput channel as
3350: 20 62 79 74 65 20 61 72 72 61 79 20 6f 72 20 68 byte array or h
3360: 65 78 20 73 74 72 69 6e 67 20 2a 2f 0a 09 7d 20 ex string */..}
3370: 65 6c 73 65 20 69 66 20 28 6d 64 5f 6c 65 6e 20 else if (md_len
3380: 3e 20 30 29 20 7b 0a 09 20 20 20 20 69 66 20 28 > 0) {.. if (
3390: 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d 61 (statePtr->forma
33a0: 74 20 26 20 42 49 4e 5f 46 4f 52 4d 41 54 29 20 t & BIN_FORMAT)
33b0: 26 26 20 74 6f 52 65 61 64 20 3e 3d 20 28 69 6e && toRead >= (in
33c0: 74 29 20 6d 64 5f 6c 65 6e 29 20 7b 0a 09 09 72 t) md_len) {...r
33d0: 65 61 64 20 3d 20 6d 64 5f 6c 65 6e 3b 0a 09 09 ead = md_len;...
33e0: 6d 65 6d 63 70 79 28 62 75 66 2c 20 6d 64 5f 62 memcpy(buf, md_b
33f0: 75 66 2c 20 72 65 61 64 29 3b 0a 0a 09 20 20 20 uf, read);...
3400: 20 7d 20 65 6c 73 65 20 69 66 28 28 73 74 61 74 } else if((stat
3410: 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 26 20 48 ePtr->format & H
3420: 45 58 5f 46 4f 52 4d 41 54 29 20 26 26 20 74 6f EX_FORMAT) && to
3430: 52 65 61 64 20 3e 3d 20 28 69 6e 74 29 20 28 6d Read >= (int) (m
3440: 64 5f 6c 65 6e 2a 32 29 29 20 7b 0a 09 09 75 6e d_len*2)) {...un
3450: 73 69 67 6e 65 64 20 63 68 61 72 20 68 65 78 5f signed char hex_
3460: 62 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 buf[EVP_MAX_MD_S
3470: 49 5a 45 2a 32 5d 3b 0a 09 09 75 6e 73 69 67 6e IZE*2];...unsign
3480: 65 64 20 63 68 61 72 20 2a 70 74 72 20 3d 20 68 ed char *ptr = h
3490: 65 78 5f 62 75 66 3b 0a 0a 09 09 66 6f 72 20 28 ex_buf;....for (
34a0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 20 3d unsigned int i =
34b0: 20 30 3b 20 69 20 3c 20 6d 64 5f 6c 65 6e 3b 20 0; i < md_len;
34c0: 69 2b 2b 29 20 7b 0a 09 09 20 20 20 20 2a 70 74 i++) {... *pt
34d0: 72 2b 2b 20 3d 20 68 65 78 5b 28 6d 64 5f 62 75 r++ = hex[(md_bu
34e0: 66 5b 69 5d 20 3e 3e 20 34 29 20 26 20 30 78 30 f[i] >> 4) & 0x0
34f0: 46 5d 3b 0a 09 09 20 20 20 20 2a 70 74 72 2b 2b F];... *ptr++
3500: 20 3d 20 68 65 78 5b 6d 64 5f 62 75 66 5b 69 5d = hex[md_buf[i]
3510: 20 26 20 30 78 30 46 5d 3b 0a 09 09 7d 0a 09 09 & 0x0F];...}...
3520: 72 65 61 64 20 3d 20 6d 64 5f 6c 65 6e 2a 32 3b read = md_len*2;
3530: 0a 09 09 6d 65 6d 63 70 79 28 62 75 66 2c 20 68 ...memcpy(buf, h
3540: 65 78 5f 62 75 66 2c 20 72 65 61 64 29 3b 0a 09 ex_buf, read);..
3550: 20 20 20 20 7d 0a 09 7d 0a 09 73 74 61 74 65 50 }..}..stateP
3560: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 48 41 tr->flags |= CHA
3570: 4e 5f 45 4f 46 3b 0a 20 20 20 20 7d 0a 20 20 20 N_EOF;. }.
3580: 20 72 65 74 75 72 6e 20 72 65 61 64 3b 0a 7d 0a return read;.}.
3590: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
35a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
35e0: 20 2a 20 44 69 67 65 73 74 4f 75 74 70 75 74 50 * DigestOutputP
35f0: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c roc --. *. *.Cal
3600: 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 led by the gener
3610: 69 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f 20 ic IO system to
3620: 77 72 69 74 65 20 64 61 74 61 20 69 6e 20 62 75 write data in bu
3630: 66 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 2e 0a f to transform..
3640: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 *. * Returns:.
3650: 2a 09 54 6f 74 61 6c 20 62 79 74 65 73 20 77 72 *.Total bytes wr
3660: 69 74 74 65 6e 20 6f 72 20 2d 31 20 66 6f 72 20 itten or -1 for
3670: 61 6e 20 65 72 72 6f 72 20 61 6c 6f 6e 67 20 77 an error along w
3680: 69 74 68 20 61 20 50 4f 53 49 58 20 65 72 72 6f ith a POSIX erro
3690: 72 0a 20 2a 09 63 6f 64 65 20 69 6e 20 65 72 72 r. *.code in err
36a0: 6f 72 43 6f 64 65 50 74 72 2e 20 55 73 65 20 45 orCodePtr. Use E
36b0: 41 47 41 49 4e 20 66 6f 72 20 6e 6f 6e 62 6c 6f AGAIN for nonblo
36c0: 63 6b 69 6e 67 20 61 6e 64 20 63 61 6e 27 74 20 cking and can't
36d0: 77 72 69 74 65 20 64 61 74 61 2e 0a 20 2a 0a 20 write data.. *.
36e0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
36f0: 20 2a 09 47 65 74 20 64 61 74 61 20 66 72 6f 6d *.Get data from
3700: 20 62 75 66 20 61 6e 64 20 75 70 64 61 74 65 20 buf and update
3710: 64 69 67 65 73 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d digest. *. *----
3720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3760: 2d 2d 0a 20 2a 2f 0a 20 69 6e 74 20 44 69 67 65 --. */. int Dige
3770: 73 74 4f 75 74 70 75 74 50 72 6f 63 28 43 6c 69 stOutputProc(Cli
3780: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
3790: 74 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a ta, const char *
37a0: 62 75 66 2c 20 69 6e 74 20 74 6f 57 72 69 74 65 buf, int toWrite
37b0: 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 , int *errorCode
37c0: 50 74 72 29 20 7b 0a 20 20 20 20 44 69 67 65 73 Ptr) {. Diges
37d0: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 tState *statePtr
37e0: 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 = (DigestState
37f0: 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 *) clientData;.
3800: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 *errorCodePtr
3810: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 = 0;.. /* Ab
3820: 6f 72 74 20 69 66 20 6e 6f 74 68 69 6e 67 20 74 ort if nothing t
3830: 6f 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 20 o process */.
3840: 20 69 66 20 28 74 6f 57 72 69 74 65 20 3c 3d 20 if (toWrite <=
3850: 30 20 7c 7c 20 73 74 61 74 65 50 74 72 2d 3e 73 0 || statePtr->s
3860: 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e elf == (Tcl_Chan
3870: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
3880: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 turn 0;. }..
3890: 20 20 20 2f 2a 20 55 70 64 61 74 65 20 68 61 73 /* Update has
38a0: 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 h function */.
38b0: 20 20 69 66 20 28 74 6f 57 72 69 74 65 20 3e 20 if (toWrite >
38c0: 30 20 26 26 20 21 54 6c 73 5f 44 69 67 65 73 74 0 && !Tls_Digest
38d0: 55 70 64 61 74 65 28 73 74 61 74 65 50 74 72 2c Update(statePtr,
38e0: 20 62 75 66 2c 20 28 73 69 7a 65 5f 74 29 20 74 buf, (size_t) t
38f0: 6f 57 72 69 74 65 2c 20 30 29 29 20 7b 0a 09 54 oWrite, 0)) {..T
3900: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 45 72 72 cl_SetChannelErr
3910: 6f 72 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c or(statePtr->sel
3920: 66 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 f, Tcl_ObjPrintf
3930: 28 22 55 70 64 61 74 65 20 66 61 69 6c 65 64 3a ("Update failed:
3940: 20 25 73 22 2c 20 52 45 41 53 4f 4e 28 29 29 29 %s", REASON()))
3950: 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 ;..*errorCodePtr
3960: 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 72 65 74 75 = EINVAL;..retu
3970: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 rn -1;. }.
3980: 20 72 65 74 75 72 6e 20 74 6f 57 72 69 74 65 3b return toWrite;
3990: 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d .}../*. *-------
39a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
39b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
39c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
39d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
39e0: 20 2a 0a 20 2a 20 44 69 67 65 73 74 53 65 74 4f *. * DigestSetO
39f0: 70 74 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a ptionProc --. *.
3a00: 20 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65 *.Called by the
3a10: 20 67 65 6e 65 72 69 63 20 49 4f 20 73 79 73 74 generic IO syst
3a20: 65 6d 20 74 6f 20 73 65 74 20 63 68 61 6e 6e 65 em to set channe
3a30: 6c 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 20 74 6f l option name to
3a40: 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a 20 52 65 value.. *. * Re
3a50: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b turns:. *.TCL_OK
3a60: 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f if successful o
3a70: 72 20 54 43 4c 5f 45 52 52 4f 52 20 69 66 20 66 r TCL_ERROR if f
3a80: 61 69 6c 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 ailed along with
3a90: 20 61 6e 20 65 72 72 6f 72 0a 20 2a 09 6d 65 73 an error. *.mes
3aa0: 73 61 67 65 20 69 6e 20 69 6e 74 65 72 70 20 61 sage in interp a
3ab0: 6e 64 20 54 63 6c 5f 53 65 74 45 72 72 6e 6f 2e nd Tcl_SetErrno.
3ac0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
3ad0: 63 74 73 3a 0a 20 2a 09 55 70 64 61 74 65 73 20 cts:. *.Updates
3ae0: 63 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 74 channel option t
3af0: 6f 20 6e 65 77 20 76 61 6c 75 65 2e 0a 20 2a 0a o new value.. *.
3b00: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
3b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b40: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 --------. */.sta
3b50: 74 69 63 20 69 6e 74 20 44 69 67 65 73 74 53 65 tic int DigestSe
3b60: 74 4f 70 74 69 6f 6e 50 72 6f 63 28 43 6c 69 65 tOptionProc(Clie
3b70: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
3b80: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
3b90: 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 nterp, const cha
3ba0: 72 20 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 0a 09 r *optionName,..
3bb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69 const char *opti
3bc0: 6f 6e 56 61 6c 75 65 29 20 7b 0a 20 20 20 20 44 onValue) {. D
3bd0: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 igestState *stat
3be0: 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 ePtr = (DigestSt
3bf0: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 ate *) clientDat
3c00: 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e a;. Tcl_Chann
3c10: 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 54 el parent;. T
3c20: 63 6c 5f 44 72 69 76 65 72 53 65 74 4f 70 74 69 cl_DriverSetOpti
3c30: 6f 6e 50 72 6f 63 20 2a 73 65 74 4f 70 74 69 6f onProc *setOptio
3c40: 6e 50 72 6f 63 3b 0a 0a 20 20 20 20 2f 2a 20 41 nProc;.. /* A
3c50: 62 6f 72 74 20 69 66 20 6e 6f 20 63 68 61 6e 6e bort if no chann
3c60: 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 el */. if (st
3c70: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 atePtr->self ==
3c80: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
3c90: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
3ca0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
3cb0: 20 20 20 20 2f 2a 20 44 65 6c 65 67 61 74 65 20 /* Delegate
3cc0: 6f 70 74 69 6f 6e 73 20 64 6f 77 6e 73 74 72 65 options downstre
3cd0: 61 6d 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 am */. parent
3ce0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 = Tcl_GetStacke
3cf0: 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 dChannel(statePt
3d00: 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 73 65 r->self);. se
3d10: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 54 63 tOptionProc = Tc
3d20: 6c 5f 43 68 61 6e 6e 65 6c 53 65 74 4f 70 74 69 l_ChannelSetOpti
3d30: 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 onProc(Tcl_GetCh
3d40: 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 6e 74 annelType(parent
3d50: 29 29 3b 0a 20 20 20 20 69 66 20 28 73 65 74 4f ));. if (setO
3d60: 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c ptionProc != NUL
3d70: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28 2a 73 L) {..return (*s
3d80: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28 54 63 etOptionProc)(Tc
3d90: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 l_GetChannelInst
3da0: 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e 74 29 anceData(parent)
3db0: 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e , interp, option
3dc0: 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 6c 75 Name, optionValu
3dd0: 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b e);. } else {
3de0: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45 ..Tcl_SetErrno(E
3df0: 49 4e 56 41 4c 29 3b 0a 09 72 65 74 75 72 6e 20 INVAL);..return
3e00: 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c 4f 70 Tcl_BadChannelOp
3e10: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 70 74 tion(interp, opt
3e20: 69 6f 6e 4e 61 6d 65 2c 20 4e 55 4c 4c 29 3b 0a ionName, NULL);.
3e30: 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d }.}../*. *--
3e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e80: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 ----. *. * Diges
3e90: 74 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2d tGetOptionProc -
3ea0: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 -. *. *.Called b
3eb0: 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f y the generic IO
3ec0: 20 73 79 73 74 65 6d 20 74 6f 20 67 65 74 20 63 system to get c
3ed0: 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 6e 61 hannel option na
3ee0: 6d 65 27 73 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 me's value.. *.
3ef0: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 * Returns:. *.TC
3f00: 4c 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 L_OK if successf
3f10: 75 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 ul or TCL_ERROR
3f20: 69 66 20 66 61 69 6c 65 64 20 61 6c 6f 6e 67 20 if failed along
3f30: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 0a 20 2a with an error. *
3f40: 09 6d 65 73 73 61 67 65 20 69 6e 20 69 6e 74 65 .message in inte
3f50: 72 70 20 61 6e 64 20 54 63 6c 5f 53 65 74 45 72 rp and Tcl_SetEr
3f60: 72 6e 6f 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 rno.. *. * Side
3f70: 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 effects:. *.Sets
3f80: 20 72 65 73 75 6c 74 20 74 6f 20 6f 70 74 69 6f result to optio
3f90: 6e 27 73 20 76 61 6c 75 65 0a 20 2a 0a 20 2a 2d n's value. *. *-
3fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3fe0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
3ff0: 20 69 6e 74 20 44 69 67 65 73 74 47 65 74 4f 70 int DigestGetOp
4000: 74 69 6f 6e 50 72 6f 63 28 43 6c 69 65 6e 74 44 tionProc(ClientD
4010: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
4020: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
4030: 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a rp, const char *
4040: 6f 70 74 69 6f 6e 4e 61 6d 65 2c 0a 09 54 63 6c optionName,..Tcl
4050: 5f 44 53 74 72 69 6e 67 20 2a 6f 70 74 69 6f 6e _DString *option
4060: 56 61 6c 75 65 29 20 7b 0a 20 20 20 20 44 69 67 Value) {. Dig
4070: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 estState *stateP
4080: 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 tr = (DigestStat
4090: 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b e *) clientData;
40a0: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c . Tcl_Channel
40b0: 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 54 63 6c parent;. Tcl
40c0: 5f 44 72 69 76 65 72 47 65 74 4f 70 74 69 6f 6e _DriverGetOption
40d0: 50 72 6f 63 20 2a 67 65 74 4f 70 74 69 6f 6e 50 Proc *getOptionP
40e0: 72 6f 63 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f roc;.. /* Abo
40f0: 72 74 20 69 66 20 6e 6f 20 63 68 61 6e 6e 65 6c rt if no channel
4100: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 */. if (stat
4110: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 ePtr->self == (T
4120: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
4130: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
4140: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
4150: 20 20 2f 2a 20 44 65 6c 65 67 61 74 65 20 6f 70 /* Delegate op
4160: 74 69 6f 6e 73 20 64 6f 77 6e 73 74 72 65 61 6d tions downstream
4170: 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 20 3d */. parent =
4180: 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 Tcl_GetStackedC
4190: 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d hannel(statePtr-
41a0: 3e 73 65 6c 66 29 3b 0a 20 20 20 20 67 65 74 4f >self);. getO
41b0: 70 74 69 6f 6e 50 72 6f 63 20 3d 20 54 63 6c 5f ptionProc = Tcl_
41c0: 43 68 61 6e 6e 65 6c 47 65 74 4f 70 74 69 6f 6e ChannelGetOption
41d0: 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 61 6e Proc(Tcl_GetChan
41e0: 6e 65 6c 54 79 70 65 28 70 61 72 65 6e 74 29 29 nelType(parent))
41f0: 3b 0a 20 20 20 20 69 66 20 28 67 65 74 4f 70 74 ;. if (getOpt
4200: 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c 4c 29 ionProc != NULL)
4210: 20 7b 0a 09 72 65 74 75 72 6e 20 28 2a 67 65 74 {..return (*get
4220: 4f 70 74 69 6f 6e 50 72 6f 63 29 28 54 63 6c 5f OptionProc)(Tcl_
4230: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e GetChannelInstan
4240: 63 65 44 61 74 61 28 70 61 72 65 6e 74 29 2c 20 ceData(parent),
4250: 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e 4e 61 interp, optionNa
4260: 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 6c 75 65 29 me, optionValue)
4270: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
4280: 28 6f 70 74 69 6f 6e 4e 61 6d 65 20 3d 3d 20 28 (optionName == (
4290: 63 68 61 72 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 char*) NULL) {..
42a0: 2f 2a 20 52 65 71 75 65 73 74 20 69 73 20 71 75 /* Request is qu
42b0: 65 72 79 20 66 6f 72 20 61 6c 6c 20 6f 70 74 69 ery for all opti
42c0: 6f 6e 73 2c 20 74 68 69 73 20 69 73 20 6f 6b 2e ons, this is ok.
42d0: 20 2a 2f 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f */..return TCL_
42e0: 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b OK;. } else {
42f0: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45 ..Tcl_SetErrno(E
4300: 49 4e 56 41 4c 29 3b 0a 09 72 65 74 75 72 6e 20 INVAL);..return
4310: 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c 4f 70 Tcl_BadChannelOp
4320: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 70 74 tion(interp, opt
4330: 69 6f 6e 4e 61 6d 65 2c 20 4e 55 4c 4c 29 3b 0a ionName, NULL);.
4340: 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d }.}../*. *--
4350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4390: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 ----. *. * Diges
43a0: 74 54 69 6d 65 72 48 61 6e 64 6c 65 72 20 2d 2d tTimerHandler --
43b0: 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 79 . *. *.Called by
43c0: 20 74 68 65 20 6e 6f 74 69 66 69 65 72 20 76 69 the notifier vi
43d0: 61 20 74 69 6d 65 72 20 74 6f 20 66 6c 75 73 68 a timer to flush
43e0: 20 6f 75 74 20 70 65 6e 64 69 6e 67 20 69 6e 70 out pending inp
43f0: 75 74 20 64 61 74 61 2e 0a 20 2a 0a 20 2a 20 52 ut data.. *. * R
4400: 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74 68 69 eturns:. *.Nothi
4410: 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 ng. *. * Side ef
4420: 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 63 61 fects:. *.May ca
4430: 6c 6c 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 ll Tcl_NotifyCha
4440: 6e 6e 65 6c 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d nnel. *. *------
4450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4490: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 . */.static void
44a0: 20 44 69 67 65 73 74 54 69 6d 65 72 48 61 6e 64 DigestTimerHand
44b0: 6c 65 72 28 43 6c 69 65 6e 74 44 61 74 61 20 63 ler(ClientData c
44c0: 6c 69 65 6e 74 44 61 74 61 29 20 7b 0a 20 20 20 lientData) {.
44d0: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 DigestState *st
44e0: 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 atePtr = (Digest
44f0: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 State *) clientD
4500: 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f ata;.. /* Abo
4510: 72 74 20 69 66 20 6e 6f 20 63 68 61 6e 6e 65 6c rt if no channel
4520: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 */. if (stat
4530: 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 ePtr->self == (T
4540: 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c cl_Channel) NULL
4550: 29 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 ) {..return;.
4560: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 72 }.. /* Clear
4570: 20 74 69 6d 65 72 20 74 6f 6b 65 6e 20 2a 2f 0a timer token */.
4580: 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 74 69 statePtr->ti
4590: 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 mer = (Tcl_Timer
45a0: 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 0a 20 20 Token) NULL;..
45b0: 20 20 2f 2a 20 46 69 72 65 20 65 76 65 6e 74 20 /* Fire event
45c0: 69 66 20 74 68 65 72 65 20 69 73 20 70 65 6e 64 if there is pend
45d0: 69 6e 67 20 64 61 74 61 2c 20 73 6b 69 70 20 6f ing data, skip o
45e0: 74 68 65 72 77 69 73 65 20 2a 2f 0a 20 20 20 20 therwise */.
45f0: 69 66 20 28 28 73 74 61 74 65 50 74 72 2d 3e 77 if ((statePtr->w
4600: 61 74 63 68 4d 61 73 6b 20 26 20 54 43 4c 5f 52 atchMask & TCL_R
4610: 45 41 44 41 42 4c 45 29 20 26 26 20 28 54 63 6c EADABLE) && (Tcl
4620: 5f 49 6e 70 75 74 42 75 66 66 65 72 65 64 28 73 _InputBuffered(s
4630: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 20 3e tatePtr->self) >
4640: 20 30 29 29 20 7b 0a 09 54 63 6c 5f 4e 6f 74 69 0)) {..Tcl_Noti
4650: 66 79 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 fyChannel(stateP
4660: 74 72 2d 3e 73 65 6c 66 2c 20 54 43 4c 5f 52 45 tr->self, TCL_RE
4670: 41 44 41 42 4c 45 29 3b 0a 20 20 20 20 7d 0a 7d ADABLE);. }.}
4680: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
4690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
46c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
46d0: 0a 20 2a 20 44 69 67 65 73 74 57 61 74 63 68 50 . * DigestWatchP
46e0: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 49 6e 69 roc --. *. *.Ini
46f0: 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 6f 74 69 tialize the noti
4700: 66 69 65 72 20 74 6f 20 77 61 74 63 68 20 66 6f fier to watch fo
4710: 72 20 65 76 65 6e 74 73 20 66 72 6f 6d 20 74 68 r events from th
4720: 69 73 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 is channel.. *.
4730: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f * Returns:. *.No
4740: 74 68 69 6e 67 20 28 63 61 6e 27 74 20 72 65 74 thing (can't ret
4750: 75 72 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 urn error messag
4760: 65 73 29 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 es). *. * Side e
4770: 66 66 65 63 74 73 3a 0a 20 2a 09 43 6f 6e 66 69 ffects:. *.Confi
4780: 67 75 72 65 20 6e 6f 74 69 66 69 65 72 20 73 6f gure notifier so
4790: 20 66 75 74 75 72 65 20 65 76 65 6e 74 73 20 6f future events o
47a0: 6e 20 74 68 65 20 63 68 61 6e 6e 65 6c 20 77 69 n the channel wi
47b0: 6c 6c 20 62 65 20 73 65 65 6e 20 62 79 20 54 63 ll be seen by Tc
47c0: 6c 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d l.. *. *--------
47d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
4810: 2a 2f 0a 23 64 65 66 69 6e 65 20 52 45 41 44 5f */.#define READ_
4820: 44 45 4c 41 59 09 35 0a 76 6f 69 64 20 44 69 67 DELAY.5.void Dig
4830: 65 73 74 57 61 74 63 68 50 72 6f 63 28 43 6c 69 estWatchProc(Cli
4840: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
4850: 74 61 2c 20 69 6e 74 20 6d 61 73 6b 29 20 7b 0a ta, int mask) {.
4860: 20 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 DigestState
4870: 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 *statePtr = (Dig
4880: 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 estState *) clie
4890: 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63 6c 5f ntData;. Tcl_
48a0: 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 3b 0a Channel parent;.
48b0: 20 20 20 20 54 63 6c 5f 44 72 69 76 65 72 57 61 Tcl_DriverWa
48c0: 74 63 68 50 72 6f 63 20 2a 77 61 74 63 68 50 72 tchProc *watchPr
48d0: 6f 63 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 oc;.. /* Abor
48e0: 74 20 69 66 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 t if no channel
48f0: 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 */. if (state
4900: 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 Ptr->self == (Tc
4910: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
4920: 20 7b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 {..return;.
4930: 7d 0a 0a 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 }.. /* Store
4940: 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f OR-ed combinatio
4950: 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c n of TCL_READABL
4960: 45 2c 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 E, TCL_WRITABLE
4970: 61 6e 64 20 54 43 4c 5f 45 58 43 45 50 54 49 4f and TCL_EXCEPTIO
4980: 4e 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 N */. statePt
4990: 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 3d 20 6d r->watchMask = m
49a0: 61 73 6b 3b 0a 0a 20 20 20 20 2f 2a 20 50 72 6f ask;.. /* Pro
49b0: 70 61 67 61 74 65 20 6d 61 73 6b 20 69 6e 66 6f pagate mask info
49c0: 20 74 6f 20 70 61 72 65 6e 74 20 63 68 61 6e 6e to parent chann
49d0: 65 6c 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 el */. parent
49e0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 = Tcl_GetStacke
49f0: 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 dChannel(statePt
4a00: 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 77 61 r->self);. wa
4a10: 74 63 68 50 72 6f 63 20 3d 20 54 63 6c 5f 43 68 tchProc = Tcl_Ch
4a20: 61 6e 6e 65 6c 57 61 74 63 68 50 72 6f 63 28 54 annelWatchProc(T
4a30: 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 cl_GetChannelTyp
4a40: 65 28 70 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 e(parent));.
4a50: 77 61 74 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 watchProc(Tcl_Ge
4a60: 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e 63 65 tChannelInstance
4a70: 44 61 74 61 28 70 61 72 65 6e 74 29 2c 20 6d 61 Data(parent), ma
4a80: 73 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 6d sk);.. /* Rem
4a90: 6f 76 65 20 70 65 6e 64 69 6e 67 20 74 69 6d 65 ove pending time
4aa0: 72 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 r */. if (sta
4ab0: 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 tePtr->timer !=
4ac0: 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 (Tcl_TimerToken)
4ad0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 NULL) {..Tcl_De
4ae0: 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 leteTimerHandler
4af0: 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 (statePtr->timer
4b00: 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 );..statePtr->ti
4b10: 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 mer = (Tcl_Timer
4b20: 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 Token) NULL;.
4b30: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 }.. /* If th
4b40: 65 72 65 20 69 73 20 64 61 74 61 20 70 65 6e 64 ere is data pend
4b50: 69 6e 67 2c 20 73 65 74 20 6e 65 77 20 74 69 6d ing, set new tim
4b60: 65 72 20 74 6f 20 63 61 6c 6c 20 54 63 6c 5f 4e er to call Tcl_N
4b70: 6f 74 69 66 79 43 68 61 6e 6e 65 6c 20 2a 2f 0a otifyChannel */.
4b80: 20 20 20 20 69 66 20 28 28 6d 61 73 6b 20 26 20 if ((mask &
4b90: 54 43 4c 5f 52 45 41 44 41 42 4c 45 29 20 26 26 TCL_READABLE) &&
4ba0: 20 28 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 (Tcl_InputBuffe
4bb0: 72 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65 red(statePtr->se
4bc0: 6c 66 29 20 3e 20 30 29 29 20 7b 0a 09 73 74 61 lf) > 0)) {..sta
4bd0: 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 54 tePtr->timer = T
4be0: 63 6c 5f 43 72 65 61 74 65 54 69 6d 65 72 48 61 cl_CreateTimerHa
4bf0: 6e 64 6c 65 72 28 52 45 41 44 5f 44 45 4c 41 59 ndler(READ_DELAY
4c00: 2c 20 44 69 67 65 73 74 54 69 6d 65 72 48 61 6e , DigestTimerHan
4c10: 64 6c 65 72 2c 20 28 43 6c 69 65 6e 74 44 61 74 dler, (ClientDat
4c20: 61 29 20 73 74 61 74 65 50 74 72 29 3b 0a 20 20 a) statePtr);.
4c30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d }.}../*. *----
4c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c80: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 47 --. *. * DigestG
4c90: 65 74 48 61 6e 64 6c 65 50 72 6f 63 20 2d 2d 0a etHandleProc --.
4ca0: 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 66 72 6f *. *.Called fro
4cb0: 6d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c m Tcl_GetChannel
4cc0: 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 72 69 65 Handle to retrie
4cd0: 76 65 20 4f 53 20 73 70 65 63 69 66 69 63 20 66 ve OS specific f
4ce0: 69 6c 65 20 68 61 6e 64 6c 65 0a 20 2a 09 66 72 ile handle. *.fr
4cf0: 6f 6d 20 69 6e 73 69 64 65 20 74 68 69 73 20 63 om inside this c
4d00: 68 61 6e 6e 65 6c 2e 20 4e 6f 74 20 75 73 65 64 hannel. Not used
4d10: 20 66 6f 72 20 74 72 61 6e 73 66 6f 72 6d 61 74 for transformat
4d20: 69 6f 6e 73 3f 0a 20 2a 0a 20 2a 20 52 65 74 75 ions?. *. * Retu
4d30: 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 66 rns:. *.TCL_OK f
4d40: 6f 72 20 73 75 63 63 65 73 73 20 6f 72 20 54 43 or success or TC
4d50: 4c 5f 45 52 52 4f 52 20 66 6f 72 20 65 72 72 6f L_ERROR for erro
4d60: 72 20 6f 72 20 69 66 20 6e 6f 74 20 73 75 70 70 r or if not supp
4d70: 6f 72 74 65 64 2e 20 49 66 0a 20 2a 09 64 69 72 orted. If. *.dir
4d80: 65 63 74 69 6f 6e 20 69 73 20 54 43 4c 5f 52 45 ection is TCL_RE
4d90: 41 44 41 42 4c 45 2c 20 73 65 74 73 20 68 61 6e ADABLE, sets han
4da0: 64 6c 65 50 74 72 20 74 6f 20 74 68 65 20 68 61 dlePtr to the ha
4db0: 6e 64 6c 65 20 75 73 65 64 20 66 6f 72 0a 20 2a ndle used for. *
4dc0: 09 69 6e 70 75 74 2c 20 6f 72 20 69 66 20 54 43 .input, or if TC
4dd0: 4c 5f 57 52 49 54 41 42 4c 45 20 73 65 74 73 20 L_WRITABLE sets
4de0: 74 6f 20 74 68 65 20 68 61 6e 64 6c 65 20 75 73 to the handle us
4df0: 65 64 20 66 6f 72 20 6f 75 74 70 75 74 2e 0a 20 ed for output..
4e00: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
4e10: 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a s:. *.None. *. *
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 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 ------. */.int D
4e70: 69 67 65 73 74 47 65 74 48 61 6e 64 6c 65 50 72 igestGetHandlePr
4e80: 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c oc(ClientData cl
4e90: 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 20 64 69 ientData, int di
4ea0: 72 65 63 74 69 6f 6e 2c 20 43 6c 69 65 6e 74 44 rection, ClientD
4eb0: 61 74 61 20 2a 68 61 6e 64 6c 65 50 74 72 29 20 ata *handlePtr)
4ec0: 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 61 74 {. DigestStat
4ed0: 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 28 44 e *statePtr = (D
4ee0: 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 63 6c igestState *) cl
4ef0: 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 54 63 ientData;. Tc
4f00: 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 72 65 6e 74 l_Channel parent
4f10: 3b 0a 0a 20 20 20 20 2f 2a 20 41 62 6f 72 74 20 ;.. /* Abort
4f20: 69 66 20 6e 6f 20 63 68 61 6e 6e 65 6c 20 2a 2f if no channel */
4f30: 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 . if (statePt
4f40: 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f r->self == (Tcl_
4f50: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
4f60: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
4f70: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 OR;. }.. p
4f80: 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47 65 74 53 arent = Tcl_GetS
4f90: 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c 28 73 74 tackedChannel(st
4fa0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 3b 0a 20 atePtr->self);.
4fb0: 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 47 65 return Tcl_Ge
4fc0: 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 28 70 tChannelHandle(p
4fd0: 61 72 65 6e 74 2c 20 64 69 72 65 63 74 69 6f 6e arent, direction
4fe0: 2c 20 68 61 6e 64 6c 65 50 74 72 29 3b 0a 7d 0a , handlePtr);.}.
4ff0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
5000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
5040: 20 2a 20 44 69 67 65 73 74 4e 6f 74 69 66 79 50 * DigestNotifyP
5050: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c roc --. *. *.Cal
5060: 6c 65 64 20 62 79 20 54 63 6c 20 74 6f 20 69 6e led by Tcl to in
5070: 66 6f 72 6d 20 75 73 20 6f 66 20 61 63 74 69 76 form us of activ
5080: 69 74 79 20 6f 6e 20 74 68 65 20 75 6e 64 65 72 ity on the under
5090: 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 2e 0a 20 lying channel..
50a0: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a *. * Returns:. *
50b0: 09 55 6e 63 68 61 6e 67 65 64 20 69 6e 74 65 72 .Unchanged inter
50c0: 65 73 74 4d 61 73 6b 20 77 68 69 63 68 20 69 73 estMask which is
50d0: 20 61 6e 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e an OR-ed combin
50e0: 61 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 ation of TCL_REA
50f0: 44 41 42 4c 45 20 6f 72 20 54 43 4c 5f 57 52 49 DABLE or TCL_WRI
5100: 54 41 42 4c 45 0a 20 2a 0a 20 2a 20 53 69 64 65 TABLE. *. * Side
5110: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 61 6e effects:. *.Can
5120: 63 65 6c 73 20 61 6e 79 20 70 65 6e 64 69 6e 67 cels any pending
5130: 20 74 69 6d 65 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d timer.. *. *---
5140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5180: 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 ---. */.int Dige
5190: 73 74 4e 6f 74 69 66 79 50 72 6f 63 28 43 6c 69 stNotifyProc(Cli
51a0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
51b0: 74 61 2c 20 69 6e 74 20 69 6e 74 65 72 65 73 74 ta, int interest
51c0: 4d 61 73 6b 29 20 7b 0a 20 20 20 20 44 69 67 65 Mask) {. Dige
51d0: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 stState *statePt
51e0: 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 r = (DigestState
51f0: 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a *) clientData;.
5200: 0a 20 20 20 20 2f 2a 20 53 6b 69 70 20 74 69 6d . /* Skip tim
5210: 65 72 20 65 76 65 6e 74 20 61 73 20 72 65 64 75 er event as redu
5220: 6e 64 61 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 ndant */. if
5230: 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 (statePtr->timer
5240: 20 21 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 6f != (Tcl_TimerTo
5250: 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 ken) NULL) {..Tc
5260: 6c 5f 44 65 6c 65 74 65 54 69 6d 65 72 48 61 6e l_DeleteTimerHan
5270: 64 6c 65 72 28 73 74 61 74 65 50 74 72 2d 3e 74 dler(statePtr->t
5280: 69 6d 65 72 29 3b 0a 09 73 74 61 74 65 50 74 72 imer);..statePtr
5290: 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 ->timer = (Tcl_T
52a0: 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b imerToken) NULL;
52b0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
52c0: 6e 20 69 6e 74 65 72 65 73 74 4d 61 73 6b 3b 0a n interestMask;.
52d0: 7d 0a 0a 2f 2a 0a 20 2a 0a 20 2a 20 43 68 61 6e }../*. *. * Chan
52e0: 6e 65 6c 20 74 79 70 65 20 73 74 72 75 63 74 75 nel type structu
52f0: 72 65 20 64 65 66 69 6e 69 74 69 6f 6e 20 66 6f re definition fo
5300: 72 20 64 69 67 65 73 74 20 74 72 61 6e 73 66 6f r digest transfo
5310: 72 6d 61 74 69 6f 6e 73 2e 0a 20 2a 0a 20 2a 2f rmations.. *. */
5320: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54 63 .static const Tc
5330: 6c 5f 43 68 61 6e 6e 65 6c 54 79 70 65 20 64 69 l_ChannelType di
5340: 67 65 73 74 43 68 61 6e 6e 65 6c 54 79 70 65 20 gestChannelType
5350: 3d 20 7b 0a 20 20 20 20 22 64 69 67 65 73 74 22 = {. "digest"
5360: 2c 09 09 09 2f 2a 20 54 79 70 65 20 6e 61 6d 65 ,.../* Type name
5370: 20 2a 2f 0a 20 20 20 20 54 43 4c 5f 43 48 41 4e */. TCL_CHAN
5380: 4e 45 4c 5f 56 45 52 53 49 4f 4e 5f 35 2c 09 2f NEL_VERSION_5,./
5390: 2a 20 76 35 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a * v5 channel */.
53a0: 20 20 20 20 44 69 67 65 73 74 43 6c 6f 73 65 50 DigestCloseP
53b0: 72 6f 63 2c 09 09 2f 2a 20 43 6c 6f 73 65 20 70 roc,../* Close p
53c0: 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 roc */. Diges
53d0: 74 49 6e 70 75 74 50 72 6f 63 2c 09 09 2f 2a 20 tInputProc,../*
53e0: 49 6e 70 75 74 20 70 72 6f 63 20 2a 2f 0a 20 20 Input proc */.
53f0: 20 20 44 69 67 65 73 74 4f 75 74 70 75 74 50 72 DigestOutputPr
5400: 6f 63 2c 09 09 2f 2a 20 4f 75 74 70 75 74 20 70 oc,../* Output p
5410: 72 6f 63 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c roc */. NULL,
5420: 09 09 09 2f 2a 20 53 65 65 6b 20 70 72 6f 63 20 .../* Seek proc
5430: 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 53 65 74 */. DigestSet
5440: 4f 70 74 69 6f 6e 50 72 6f 63 2c 09 2f 2a 20 53 OptionProc,./* S
5450: 65 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63 20 2a et option proc *
5460: 2f 0a 20 20 20 20 44 69 67 65 73 74 47 65 74 4f /. DigestGetO
5470: 70 74 69 6f 6e 50 72 6f 63 2c 09 2f 2a 20 47 65 ptionProc,./* Ge
5480: 74 20 6f 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f t option proc */
5490: 0a 20 20 20 20 44 69 67 65 73 74 57 61 74 63 68 . DigestWatch
54a0: 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 69 74 69 61 Proc,../* Initia
54b0: 6c 69 7a 65 20 6e 6f 74 69 66 69 65 72 20 2a 2f lize notifier */
54c0: 0a 20 20 20 20 44 69 67 65 73 74 47 65 74 48 61 . DigestGetHa
54d0: 6e 64 6c 65 50 72 6f 63 2c 09 2f 2a 20 47 65 74 ndleProc,./* Get
54e0: 20 4f 53 20 68 61 6e 64 6c 65 73 20 6f 75 74 20 OS handles out
54f0: 6f 66 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 of channel */.
5500: 20 20 44 69 67 65 73 74 43 6c 6f 73 65 32 50 72 DigestClose2Pr
5510: 6f 63 2c 09 09 2f 2a 20 63 6c 6f 73 65 32 70 72 oc,../* close2pr
5520: 6f 63 20 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 oc */. Digest
5530: 42 6c 6f 63 6b 4d 6f 64 65 50 72 6f 63 2c 09 2f BlockModeProc,./
5540: 2a 20 53 65 74 20 62 6c 6f 63 6b 69 6e 67 2f 6e * Set blocking/n
5550: 6f 6e 62 6c 6f 63 6b 69 6e 67 20 6d 6f 64 65 2a onblocking mode*
5560: 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a /. NULL,.../*
5570: 20 46 6c 75 73 68 20 70 72 6f 63 20 2a 2f 0a 20 Flush proc */.
5580: 20 20 20 44 69 67 65 73 74 4e 6f 74 69 66 79 50 DigestNotifyP
5590: 72 6f 63 2c 09 09 2f 2a 20 48 61 6e 64 6c 69 6e roc,../* Handlin
55a0: 67 20 6f 66 20 65 76 65 6e 74 73 20 62 75 62 62 g of events bubb
55b0: 6c 69 6e 67 20 75 70 20 2a 2f 0a 20 20 20 20 4e ling up */. N
55c0: 55 4c 4c 2c 09 09 09 2f 2a 20 57 69 64 65 20 73 ULL,.../* Wide s
55d0: 65 65 6b 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 eek proc */.
55e0: 4e 55 4c 4c 2c 09 09 09 2f 2a 20 54 68 72 65 61 NULL,.../* Threa
55f0: 64 20 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 d action */.
5600: 4e 55 4c 4c 09 09 09 2f 2a 20 54 72 75 6e 63 61 NULL.../* Trunca
5610: 74 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d te */.};../*. *-
5620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5660: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
5670: 44 69 67 65 73 74 43 68 61 6e 6e 65 6c 20 2d 2d DigestChannel --
5680: 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65 20 61 20 . *. *.Create a
5690: 73 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20 stacked channel
56a0: 66 6f 72 20 61 20 6d 65 73 73 61 67 65 20 64 69 for a message di
56b0: 67 65 73 74 20 74 72 61 6e 73 66 6f 72 6d 61 74 gest transformat
56c0: 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 ion.. *. * Retur
56d0: 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 ns:. *.TCL_OK or
56e0: 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a TCL_ERROR. *. *
56f0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
5700: 2a 09 41 64 64 73 20 74 72 61 6e 73 66 6f 72 6d *.Adds transform
5710: 20 74 6f 20 63 68 61 6e 6e 65 6c 20 61 6e 64 20 to channel and
5720: 73 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 63 sets result to c
5730: 68 61 6e 6e 65 6c 20 69 64 20 6f 72 20 65 72 72 hannel id or err
5740: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 or message.. *.
5750: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
5760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5790: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
57a0: 69 63 20 69 6e 74 0a 54 6c 73 5f 44 69 67 65 73 ic int.Tls_Diges
57b0: 74 43 68 61 6e 6e 65 6c 28 54 63 6c 5f 49 6e 74 tChannel(Tcl_Int
57c0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e erp *interp, con
57d0: 73 74 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c st char *channel
57e0: 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a , const EVP_MD *
57f0: 6d 64 2c 0a 09 63 6f 6e 73 74 20 45 56 50 5f 43 md,..const EVP_C
5800: 49 50 48 45 52 20 2a 63 69 70 68 65 72 2c 20 69 IPHER *cipher, i
5810: 6e 74 20 66 6f 72 6d 61 74 2c 20 54 63 6c 5f 4f nt format, Tcl_O
5820: 62 6a 20 2a 6b 65 79 4f 62 6a 29 20 7b 0a 20 20 bj *keyObj) {.
5830: 20 20 69 6e 74 20 6d 6f 64 65 3b 20 2f 2a 20 4f int mode; /* O
5840: 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e R-ed combination
5850: 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 of TCL_READABLE
5860: 20 61 6e 64 20 54 43 4c 5f 57 52 49 54 41 42 4c and TCL_WRITABL
5870: 45 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 43 68 61 E */. Tcl_Cha
5880: 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 44 nnel chan;. D
5890: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 igestState *stat
58a0: 65 50 74 72 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 ePtr;.. /* Va
58b0: 6c 69 64 61 74 65 20 61 72 67 73 20 2a 2f 0a 20 lidate args */.
58c0: 20 20 20 69 66 20 28 63 68 61 6e 6e 65 6c 20 3d if (channel =
58d0: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 = (const char *)
58e0: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e NULL) {..return
58f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
5900: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68 }.. /* Get ch
5910: 61 6e 6e 65 6c 20 49 64 20 2a 2f 0a 20 20 20 20 annel Id */.
5920: 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 chan = Tcl_GetCh
5930: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 annel(interp, ch
5940: 61 6e 6e 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 20 annel, &mode);.
5950: 20 20 20 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 if (chan == (
5960: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
5970: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
5980: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
5990: 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 /* Make sure
59a0: 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 to operate on th
59b0: 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 e topmost channe
59c0: 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 l */. chan =
59d0: 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 Tcl_GetTopChanne
59e0: 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a l(chan);.. /*
59f0: 20 43 72 65 61 74 65 20 73 74 61 74 65 20 64 61 Create state da
5a00: 74 61 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 20 ta struct */.
5a10: 20 69 66 20 28 28 73 74 61 74 65 50 74 72 20 3d if ((statePtr =
5a20: 20 54 6c 73 5f 44 69 67 65 73 74 4e 65 77 28 69 Tls_DigestNew(i
5a30: 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74 29 29 20 nterp, format))
5a40: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f == NULL) {..Tcl_
5a50: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
5a60: 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20 61 6c 6c erp, "Memory all
5a70: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c 20 ocation error",
5a80: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a (char *) NULL);.
5a90: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
5aa0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 74 61 R;. }. sta
5ab0: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 63 68 tePtr->self = ch
5ac0: 61 6e 3b 0a 20 20 20 20 73 74 61 74 65 50 74 72 an;. statePtr
5ad0: 2d 3e 6d 6f 64 65 20 3d 20 6d 6f 64 65 3b 0a 0a ->mode = mode;..
5ae0: 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a /* Initializ
5af0: 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 e hash function
5b00: 2a 2f 0a 20 20 20 20 69 66 20 28 54 6c 73 5f 44 */. if (Tls_D
5b10: 69 67 65 73 74 49 6e 69 74 28 69 6e 74 65 72 70 igestInit(interp
5b20: 2c 20 73 74 61 74 65 50 74 72 2c 20 6d 64 2c 20 , statePtr, md,
5b30: 63 69 70 68 65 72 2c 20 6b 65 79 4f 62 6a 29 20 cipher, keyObj)
5b40: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 != TCL_OK) {..re
5b50: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
5b60: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f }.. /* Co
5b70: 6e 66 69 67 75 72 65 20 63 68 61 6e 6e 65 6c 20 nfigure channel
5b80: 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65 74 43 68 */. Tcl_SetCh
5b90: 61 6e 6e 65 6c 4f 70 74 69 6f 6e 28 69 6e 74 65 annelOption(inte
5ba0: 72 70 2c 20 63 68 61 6e 2c 20 22 2d 74 72 61 6e rp, chan, "-tran
5bb0: 73 6c 61 74 69 6f 6e 22 2c 20 22 62 69 6e 61 72 slation", "binar
5bc0: 79 22 29 3b 0a 20 20 20 20 69 66 20 28 54 63 6c y");. if (Tcl
5bd0: 5f 47 65 74 43 68 61 6e 6e 65 6c 42 75 66 66 65 _GetChannelBuffe
5be0: 72 53 69 7a 65 28 63 68 61 6e 29 20 3c 20 45 56 rSize(chan) < EV
5bf0: 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 20 2a 20 P_MAX_MD_SIZE *
5c00: 32 29 20 7b 0a 09 54 63 6c 5f 53 65 74 43 68 61 2) {..Tcl_SetCha
5c10: 6e 6e 65 6c 42 75 66 66 65 72 53 69 7a 65 28 63 nnelBufferSize(c
5c20: 68 61 6e 2c 20 45 56 50 5f 4d 41 58 5f 4d 44 5f han, EVP_MAX_MD_
5c30: 53 49 5a 45 20 2a 20 32 29 3b 0a 20 20 20 20 7d SIZE * 2);. }
5c40: 0a 0a 20 20 20 20 2f 2a 20 53 74 61 63 6b 20 63 .. /* Stack c
5c50: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 73 74 hannel */. st
5c60: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 20 54 atePtr->self = T
5c70: 63 6c 5f 53 74 61 63 6b 43 68 61 6e 6e 65 6c 28 cl_StackChannel(
5c80: 69 6e 74 65 72 70 2c 20 26 64 69 67 65 73 74 43 interp, &digestC
5c90: 68 61 6e 6e 65 6c 54 79 70 65 2c 20 28 43 6c 69 hannelType, (Cli
5ca0: 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 50 74 entData) statePt
5cb0: 72 2c 20 6d 6f 64 65 2c 20 63 68 61 6e 29 3b 0a r, mode, chan);.
5cc0: 20 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 if (statePtr
5cd0: 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 6c 5f 43 ->self == (Tcl_C
5ce0: 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a hannel) NULL) {.
5cf0: 09 54 6c 73 5f 44 69 67 65 73 74 46 72 65 65 28 .Tls_DigestFree(
5d00: 73 74 61 74 65 50 74 72 29 3b 0a 09 72 65 74 75 statePtr);..retu
5d10: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
5d20: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 }.. /* Set
5d30: 72 65 73 75 6c 74 20 74 6f 20 63 68 61 6e 6e 65 result to channe
5d40: 6c 20 49 64 20 2a 2f 0a 20 20 20 20 54 63 6c 5f l Id */. Tcl_
5d50: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 SetResult(interp
5d60: 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c 5f 47 , (char *) Tcl_G
5d70: 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 etChannelName(ch
5d80: 61 6e 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c an), TCL_VOLATIL
5d90: 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 E);. return T
5da0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d CL_OK;.}../*. *-
5db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5df0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e 73 74 -----. *. * Unst
5e00: 61 63 6b 20 43 68 61 6e 6e 65 6c 20 2d 2d 0a 20 ack Channel --.
5e10: 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 *. *.This functi
5e20: 6f 6e 20 72 65 6d 6f 76 65 73 20 74 68 65 20 73 on removes the s
5e30: 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 20 66 tacked channel f
5e40: 72 6f 6d 20 74 68 65 20 74 6f 70 20 6f 66 20 74 rom the top of t
5e50: 68 65 0a 20 2a 09 63 68 61 6e 6e 65 6c 20 73 74 he. *.channel st
5e60: 61 63 6b 20 69 66 20 69 74 20 69 73 20 61 20 64 ack if it is a d
5e70: 69 67 65 73 74 20 63 68 61 6e 6e 65 6c 2e 0a 20 igest channel..
5e80: 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a *. * Returns:. *
5e90: 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 .TCL_OK or TCL_E
5ea0: 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 RROR. *. * Side
5eb0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 52 65 6d 6f effects:. *.Remo
5ec0: 76 65 73 20 74 72 61 6e 73 66 6f 72 6d 20 66 72 ves transform fr
5ed0: 6f 6d 20 63 68 61 6e 6e 65 6c 20 6f 72 20 73 65 om channel or se
5ee0: 74 73 20 72 65 73 75 6c 74 20 74 6f 20 65 72 72 ts result to err
5ef0: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 or message.. *.
5f00: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
5f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5f40: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 -------. */.stat
5f50: 69 63 20 69 6e 74 0a 55 6e 73 74 61 63 6b 4f 62 ic int.UnstackOb
5f60: 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 jCmd(ClientData
5f70: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
5f80: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
5f90: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
5fa0: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
5fb0: 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e {. Tcl_Chann
5fc0: 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 69 6e 74 el chan;. int
5fd0: 20 6d 6f 64 65 3b 20 2f 2a 20 4f 52 2d 65 64 20 mode; /* OR-ed
5fe0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54 combination of T
5ff0: 43 4c 5f 52 45 41 44 41 42 4c 45 20 61 6e 64 20 CL_READABLE and
6000: 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 20 2a 2f TCL_WRITABLE */
6010: 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74 .. /* Validat
6020: 65 20 61 72 67 20 63 6f 75 6e 74 20 2a 2f 0a 20 e arg count */.
6030: 20 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 32 if (objc != 2
6040: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
6050: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c mArgs(interp, 1,
6060: 20 6f 62 6a 76 2c 20 22 63 68 61 6e 6e 65 6c 22 objv, "channel"
6070: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
6080: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
6090: 20 2f 2a 20 47 65 74 20 63 68 61 6e 6e 65 6c 20 /* Get channel
60a0: 2a 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 */. chan = Tc
60b0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28 69 6e 74 l_GetChannel(int
60c0: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 erp, Tcl_GetStri
60d0: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 ngFromObj(objv[1
60e0: 5d 2c 20 4e 55 4c 4c 29 2c 20 26 6d 6f 64 65 29 ], NULL), &mode)
60f0: 3b 0a 20 20 20 20 69 66 20 28 63 68 61 6e 20 3d ;. if (chan =
6100: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
6110: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
6120: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
6130: 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75 .. /* Make su
6140: 72 65 20 74 6f 20 6f 70 65 72 61 74 65 20 6f 6e re to operate on
6150: 20 74 68 65 20 74 6f 70 6d 6f 73 74 20 63 68 61 the topmost cha
6160: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
6170: 20 3d 20 54 63 6c 5f 47 65 74 54 6f 70 43 68 61 = Tcl_GetTopCha
6180: 6e 6e 65 6c 28 63 68 61 6e 29 3b 0a 0a 20 20 20 nnel(chan);..
6190: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 69 67 /* Check if dig
61a0: 65 73 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 est channel */.
61b0: 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 43 68 if (Tcl_GetCh
61c0: 61 6e 6e 65 6c 54 79 70 65 28 63 68 61 6e 29 20 annelType(chan)
61d0: 21 3d 20 26 64 69 67 65 73 74 43 68 61 6e 6e 65 != &digestChanne
61e0: 6c 54 79 70 65 29 20 7b 0a 09 54 63 6c 5f 41 70 lType) {..Tcl_Ap
61f0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
6200: 70 2c 20 22 62 61 64 20 63 68 61 6e 6e 65 6c 20 p, "bad channel
6210: 5c 22 22 2c 20 54 63 6c 5f 47 65 74 43 68 61 6e \"", Tcl_GetChan
6220: 6e 65 6c 4e 61 6d 65 28 63 68 61 6e 29 2c 0a 09 nelName(chan),..
6230: 20 20 20 20 22 5c 22 3a 20 6e 6f 74 20 61 20 64 "\": not a d
6240: 69 67 65 73 74 20 63 68 61 6e 6e 65 6c 22 2c 20 igest channel",
6250: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 53 65 74 45 NULL);..Tcl_SetE
6260: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
6270: 20 22 54 4c 53 22 2c 20 22 55 4e 53 54 41 43 4b "TLS", "UNSTACK
6280: 22 2c 20 22 43 48 41 4e 4e 45 4c 22 2c 20 22 49 ", "CHANNEL", "I
6290: 4e 56 41 4c 49 44 22 2c 20 28 63 68 61 72 20 2a NVALID", (char *
62a0: 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e ) NULL);..return
62b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
62c0: 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 20 74 72 }.. /* Pop tr
62d0: 61 6e 73 66 6f 72 6d 20 66 72 6f 6d 20 63 68 61 ansform from cha
62e0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 72 65 74 75 nnel */. retu
62f0: 72 6e 20 54 63 6c 5f 55 6e 73 74 61 63 6b 43 68 rn Tcl_UnstackCh
6300: 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 annel(interp, ch
6310: 61 6e 29 3b 0a 20 20 20 20 09 63 6c 69 65 6e 74 an);. .client
6320: 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 74 Data = clientDat
6330: 61 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a a;.}../*********
6340: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6350: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 73 74 61 **********/..sta
6380: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a tic const char *
6390: 69 6e 73 74 61 6e 63 65 5f 66 6e 73 20 5b 5d 20 instance_fns []
63a0: 3d 20 7b 20 22 66 69 6e 61 6c 69 7a 65 22 2c 20 = { "finalize",
63b0: 22 75 70 64 61 74 65 22 2c 20 4e 55 4c 4c 20 7d "update", NULL }
63c0: 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ;../*. *--------
63d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
63e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
63f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 -----------. *.
6410: 2a 20 49 6e 73 74 61 6e 63 65 4f 62 6a 43 6d 64 * InstanceObjCmd
6420: 20 2d 2d 0a 20 2a 0a 20 2a 09 48 61 6e 64 6c 65 --. *. *.Handle
6430: 72 20 66 6f 72 20 64 69 67 65 73 74 20 63 6f 6d r for digest com
6440: 6d 61 6e 64 20 69 6e 73 74 61 6e 63 65 73 2e 20 mand instances.
6450: 55 73 65 64 20 74 6f 20 61 64 64 20 64 61 74 61 Used to add data
6460: 20 74 6f 20 68 61 73 68 0a 20 2a 09 66 75 6e 63 to hash. *.func
6470: 74 69 6f 6e 20 6f 72 20 72 65 74 72 69 65 76 65 tion or retrieve
6480: 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 2e message digest.
6490: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a . *. * Returns:.
64a0: 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c *.TCL_OK or TCL
64b0: 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 _ERROR. *. * Sid
64c0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 41 64 e effects:. *.Ad
64d0: 64 73 20 64 61 74 61 20 74 6f 20 68 61 73 68 20 ds data to hash
64e0: 6f 72 20 72 65 74 75 72 6e 73 20 6d 65 73 73 61 or returns messa
64f0: 67 65 20 64 69 67 65 73 74 0a 20 2a 0a 20 2a 2d ge digest. *. *-
6500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6540: 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 49 6e 73 74 61 --. */.int Insta
6550: 6e 63 65 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 nceObjCmd(Client
6560: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
6570: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
6580: 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 erp, int objc, T
6590: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
65a0: 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 44 69 67 65 jv[]) {. Dige
65b0: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 stState *statePt
65c0: 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 r = (DigestState
65d0: 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a *) clientData;.
65e0: 20 20 20 20 69 6e 74 20 66 6e 2c 20 6c 65 6e 20 int fn, len
65f0: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 62 = 0;. char *b
6600: 75 66 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 uf = NULL;..
6610: 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67 20 /* Validate arg
6620: 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 count */. if
6630: 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a (objc < 2 || obj
6640: 63 20 3e 20 33 29 20 7b 0a 09 54 63 6c 5f 57 72 c > 3) {..Tcl_Wr
6650: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
6660: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 66 75 6e p, 1, objv, "fun
6670: 63 74 69 6f 6e 20 3f 64 61 74 61 3f 22 29 3b 0a ction ?data?");.
6680: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
6690: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
66a0: 20 47 65 74 20 66 75 6e 63 74 69 6f 6e 20 2a 2f Get function */
66b0: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 47 65 74 . if (Tcl_Get
66c0: 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 IndexFromObj(int
66d0: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 69 6e erp, objv[1], in
66e0: 73 74 61 6e 63 65 5f 66 6e 73 2c 20 22 66 75 6e stance_fns, "fun
66f0: 63 74 69 6f 6e 22 2c 20 30 2c 20 26 66 6e 29 20 ction", 0, &fn)
6700: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 != TCL_OK) {..re
6710: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
6720: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f }.. /* Do
6730: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 function */.
6740: 20 69 66 20 28 66 6e 29 20 7b 0a 09 2f 2a 20 47 if (fn) {../* G
6750: 65 74 20 64 61 74 61 20 6f 72 20 72 65 74 75 72 et data or retur
6760: 6e 20 65 72 72 6f 72 20 69 66 20 6e 6f 6e 65 20 n error if none
6770: 2a 2f 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 */..if (objc ==
6780: 33 29 20 7b 0a 09 20 20 20 20 62 75 66 20 3d 20 3) {.. buf =
6790: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 Tcl_GetByteArray
67a0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c FromObj(objv[2],
67b0: 20 26 6c 65 6e 29 3b 0a 09 7d 20 65 6c 73 65 20 &len);..} else
67c0: 7b 0a 09 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 {.. Tcl_Wrong
67d0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
67e0: 31 2c 20 6f 62 6a 76 2c 20 22 75 70 64 61 74 65 1, objv, "update
67f0: 20 64 61 74 61 22 29 3b 0a 09 20 20 20 20 72 65 data");.. re
6800: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
6810: 09 7d 0a 0a 09 2f 2a 20 55 70 64 61 74 65 20 68 .}.../* Update h
6820: 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a ash function */.
6830: 09 69 66 20 28 21 54 6c 73 5f 44 69 67 65 73 74 .if (!Tls_Digest
6840: 55 70 64 61 74 65 28 73 74 61 74 65 50 74 72 2c Update(statePtr,
6850: 20 62 75 66 2c 20 28 73 69 7a 65 5f 74 29 20 6c buf, (size_t) l
6860: 65 6e 2c 20 31 29 29 20 7b 0a 09 20 20 20 20 72 en, 1)) {.. r
6870: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
6880: 0a 09 7d 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 ..}.. } else
6890: 7b 0a 09 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 68 {../* Finalize h
68a0: 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 ash function and
68b0: 20 63 61 6c 63 75 6c 61 74 65 20 6d 65 73 73 61 calculate messa
68c0: 67 65 20 64 69 67 65 73 74 20 2a 2f 0a 09 69 66 ge digest */..if
68d0: 20 28 54 6c 73 5f 44 69 67 65 73 74 46 69 6e 69 (Tls_DigestFini
68e0: 61 6c 69 7a 65 28 69 6e 74 65 72 70 2c 20 73 74 alize(interp, st
68f0: 61 74 65 50 74 72 29 20 21 3d 20 54 43 4c 5f 4f atePtr) != TCL_O
6900: 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e K) {.. return
6910: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a TCL_ERROR;..}..
6920: 09 54 63 6c 5f 44 65 6c 65 74 65 43 6f 6d 6d 61 .Tcl_DeleteComma
6930: 6e 64 46 72 6f 6d 54 6f 6b 65 6e 28 69 6e 74 65 ndFromToken(inte
6940: 72 70 2c 20 73 74 61 74 65 50 74 72 2d 3e 74 6f rp, statePtr->to
6950: 6b 65 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ken);. }.
6960: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
6970: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
6980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
69a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
69b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
69c0: 20 49 6e 73 74 61 6e 63 65 44 65 6c 43 61 6c 6c InstanceDelCall
69d0: 62 61 63 6b 20 2d 2d 0a 20 2a 0a 20 2a 09 20 43 back --. *. *. C
69e0: 61 6c 6c 62 61 63 6b 20 74 6f 20 63 6c 65 61 6e allback to clean
69f0: 2d 75 70 20 77 68 65 6e 20 64 69 67 65 73 74 20 -up when digest
6a00: 69 6e 73 74 61 6e 63 65 20 63 6f 6d 6d 61 6e 64 instance command
6a10: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 2a 0a is deleted.. *.
6a20: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e * Returns:. *.N
6a30: 6f 74 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 othing. *. * Sid
6a40: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 44 65 e effects:. *.De
6a50: 73 74 72 6f 79 73 20 73 74 72 75 63 74 0a 20 2a stroys struct. *
6a60: 0a 20 2a 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 2d 2d 2d 2d ----------------
6a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6aa0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 76 6f 69 64 20 ------. */.void
6ab0: 49 6e 73 74 61 6e 63 65 44 65 6c 43 61 6c 6c 62 InstanceDelCallb
6ac0: 61 63 6b 28 43 6c 69 65 6e 74 44 61 74 61 20 63 ack(ClientData c
6ad0: 6c 69 65 6e 74 44 61 74 61 29 20 7b 0a 20 20 20 lientData) {.
6ae0: 20 44 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 DigestState *st
6af0: 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 atePtr = (Digest
6b00: 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 State *) clientD
6b10: 61 74 61 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 ata;.. /* Cle
6b20: 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 20 54 6c 73 an-up */. Tls
6b30: 5f 44 69 67 65 73 74 46 72 65 65 28 73 74 61 74 _DigestFree(stat
6b40: 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d ePtr);.}../*. *-
6b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6b90: 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 --. *. * Tls_Dig
6ba0: 65 73 74 49 6e 73 74 61 6e 63 65 20 2d 2d 0a 20 estInstance --.
6bb0: 2a 0a 20 2a 09 20 43 72 65 61 74 65 20 63 6f 6d *. *. Create com
6bc0: 6d 61 6e 64 20 74 6f 20 61 6c 6c 6f 77 20 75 73 mand to allow us
6bd0: 65 72 20 74 6f 20 61 64 64 20 64 61 74 61 20 74 er to add data t
6be0: 6f 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e o hash function.
6bf0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a . *. * Returns:.
6c00: 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c *.TCL_OK or TCL
6c10: 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 _ERROR. *. * Sid
6c20: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 72 e effects:. *.Cr
6c30: 65 61 74 65 73 20 63 6f 6d 6d 61 6e 64 20 6f 72 eates command or
6c40: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 error message.
6c50: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
6c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6c90: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 -------. */.int
6ca0: 54 6c 73 5f 44 69 67 65 73 74 49 6e 73 74 61 6e Tls_DigestInstan
6cb0: 63 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 ce(Tcl_Interp *i
6cc0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a nterp, Tcl_Obj *
6cd0: 63 6d 64 4f 62 6a 2c 20 63 6f 6e 73 74 20 45 56 cmdObj, const EV
6ce0: 50 5f 4d 44 20 2a 6d 64 2c 0a 09 63 6f 6e 73 74 P_MD *md,..const
6cf0: 20 45 56 50 5f 43 49 50 48 45 52 20 2a 63 69 70 EVP_CIPHER *cip
6d00: 68 65 72 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c her, int format,
6d10: 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a Tcl_Obj *keyObj
6d20: 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 ) {. DigestSt
6d30: 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a 20 ate *statePtr;.
6d40: 20 20 20 63 68 61 72 20 2a 63 6d 64 4e 61 6d 65 char *cmdName
6d50: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 = Tcl_GetString
6d60: 46 72 6f 6d 4f 62 6a 28 63 6d 64 4f 62 6a 2c 20 FromObj(cmdObj,
6d70: 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 NULL);.. /* C
6d80: 72 65 61 74 65 20 73 74 61 74 65 20 64 61 74 61 reate state data
6d90: 20 73 74 72 75 63 74 20 2a 2f 0a 20 20 20 20 69 struct */. i
6da0: 66 20 28 28 73 74 61 74 65 50 74 72 20 3d 20 54 f ((statePtr = T
6db0: 6c 73 5f 44 69 67 65 73 74 4e 65 77 28 69 6e 74 ls_DigestNew(int
6dc0: 65 72 70 2c 20 66 6f 72 6d 61 74 29 29 20 3d 3d erp, format)) ==
6dd0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 NULL) {..Tcl_Ap
6de0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 pendResult(inter
6df0: 70 2c 20 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 p, "Memory alloc
6e00: 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c 20 28 63 ation error", (c
6e10: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 har *) NULL);..r
6e20: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
6e30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 . }.. /* I
6e40: 6e 69 74 69 61 6c 69 7a 65 20 68 61 73 68 20 66 nitialize hash f
6e50: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 unction */. i
6e60: 66 20 28 54 6c 73 5f 44 69 67 65 73 74 49 6e 69 f (Tls_DigestIni
6e70: 74 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 50 t(interp, stateP
6e80: 74 72 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c 20 tr, md, cipher,
6e90: 6b 65 79 4f 62 6a 29 20 21 3d 20 54 43 4c 5f 4f keyObj) != TCL_O
6ea0: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c K) {..return TCL
6eb0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
6ec0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 69 6e 73 /* Create ins
6ed0: 74 61 6e 63 65 20 63 6f 6d 6d 61 6e 64 20 2a 2f tance command */
6ee0: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 74 . statePtr->t
6ef0: 6f 6b 65 6e 20 3d 20 54 63 6c 5f 43 72 65 61 74 oken = Tcl_Creat
6f00: 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 eObjCommand(inte
6f10: 72 70 2c 20 63 6d 64 4e 61 6d 65 2c 20 49 6e 73 rp, cmdName, Ins
6f20: 74 61 6e 63 65 4f 62 6a 43 6d 64 2c 0a 09 28 43 tanceObjCmd,..(C
6f30: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
6f40: 50 74 72 2c 20 49 6e 73 74 61 6e 63 65 44 65 6c Ptr, InstanceDel
6f50: 43 61 6c 6c 62 61 63 6b 29 3b 0a 0a 20 20 20 20 Callback);..
6f60: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 6d 6d 61 6e /* Return comman
6f70: 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 54 63 d name */. Tc
6f80: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
6f90: 6e 74 65 72 70 2c 20 63 6d 64 4f 62 6a 29 3b 0a nterp, cmdObj);.
6fa0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
6fb0: 4b 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a K;.}.../********
6fc0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6fd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6fe0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6ff0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a ***********/../*
7000: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
7010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7040: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
7050: 5f 44 69 67 65 73 74 44 61 74 61 20 2d 2d 0a 20 _DigestData --.
7060: 2a 0a 20 2a 09 52 65 74 75 72 6e 20 6d 65 73 73 *. *.Return mess
7070: 61 67 65 20 64 69 67 65 73 74 20 66 6f 72 20 64 age digest for d
7080: 61 74 61 20 75 73 69 6e 67 20 75 73 65 72 20 73 ata using user s
7090: 70 65 63 69 66 69 65 64 20 68 61 73 68 20 66 75 pecified hash fu
70a0: 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 nction.. *. * Re
70b0: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b turns:. *.TCL_OK
70c0: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a or TCL_ERROR. *
70d0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
70e0: 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 :. *.Sets result
70f0: 20 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65 to message dige
7100: 73 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 st or error mess
7110: 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d age. *. *-------
7120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
7160: 0a 69 6e 74 0a 54 6c 73 5f 44 69 67 65 73 74 44 .int.Tls_DigestD
7170: 61 74 61 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a ata(Tcl_Interp *
7180: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
7190: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
71a0: 20 6f 62 6a 76 5b 5d 2c 0a 09 63 6f 6e 73 74 20 objv[],..const
71b0: 45 56 50 5f 4d 44 20 2a 6d 64 2c 20 63 6f 6e 73 EVP_MD *md, cons
71c0: 74 20 45 56 50 5f 43 49 50 48 45 52 20 2a 63 69 t EVP_CIPHER *ci
71d0: 70 68 65 72 2c 20 69 6e 74 20 66 6f 72 6d 61 74 pher, int format
71e0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 , Tcl_Obj *keyOb
71f0: 6a 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 64 j) {. char *d
7200: 61 74 61 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e ata;. int len
7210: 2c 20 72 65 73 3b 0a 20 20 20 20 75 6e 73 69 67 , res;. unsig
7220: 6e 65 64 20 69 6e 74 20 6d 64 5f 6c 65 6e 3b 0a ned int md_len;.
7230: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 unsigned cha
7240: 72 20 6d 64 5f 62 75 66 5b 45 56 50 5f 4d 41 58 r md_buf[EVP_MAX
7250: 5f 4d 44 5f 53 49 5a 45 5d 3b 0a 0a 20 20 20 20 _MD_SIZE];..
7260: 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72 67 20 /* Validate arg
7270: 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 69 66 20 count */. if
7280: 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 (objc != 2) {..T
7290: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
72a0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
72b0: 20 22 64 61 74 61 22 29 3b 0a 09 72 65 74 75 72 "data");..retur
72c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
72d0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 64 }.. /* Get d
72e0: 61 74 61 20 2a 2f 0a 20 20 20 20 64 61 74 61 20 ata */. data
72f0: 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 = Tcl_GetByteArr
7300: 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 ayFromObj(objv[1
7310: 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 20 20 69 66 ], &len);. if
7320: 20 28 64 61 74 61 20 3d 3d 20 4e 55 4c 4c 20 7c (data == NULL |
7330: 7c 20 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 54 | len == 0) {..T
7340: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 cl_SetResult(int
7350: 65 72 70 2c 20 22 4e 6f 20 64 61 74 61 22 2c 20 erp, "No data",
7360: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
7370: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
7380: 0a 20 20 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 . /* Calculat
7390: 65 20 64 69 67 65 73 74 20 62 61 73 65 64 20 6f e digest based o
73a0: 6e 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 n hash function
73b0: 2a 2f 0a 20 20 20 20 69 66 20 28 66 6f 72 6d 61 */. if (forma
73c0: 74 20 26 20 54 59 50 45 5f 4d 44 29 20 7b 0a 09 t & TYPE_MD) {..
73d0: 72 65 73 20 3d 20 45 56 50 5f 44 69 67 65 73 74 res = EVP_Digest
73e0: 28 64 61 74 61 2c 20 28 73 69 7a 65 5f 74 29 20 (data, (size_t)
73f0: 6c 65 6e 2c 20 6d 64 5f 62 75 66 2c 20 26 6d 64 len, md_buf, &md
7400: 5f 6c 65 6e 2c 20 6d 64 2c 20 4e 55 4c 4c 29 3b _len, md, NULL);
7410: 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 .. } else if
7420: 28 66 6f 72 6d 61 74 20 26 20 54 59 50 45 5f 48 (format & TYPE_H
7430: 4d 41 43 29 20 7b 0a 09 75 6e 73 69 67 6e 65 64 MAC) {..unsigned
7440: 20 63 68 61 72 20 2a 6b 65 79 2c 20 2a 68 6d 61 char *key, *hma
7450: 63 20 3d 20 4e 55 4c 4c 3b 0a 09 69 6e 74 20 6b c = NULL;..int k
7460: 65 79 5f 6c 65 6e 3b 0a 0a 09 6b 65 79 20 3d 20 ey_len;...key =
7470: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 Tcl_GetByteArray
7480: 46 72 6f 6d 4f 62 6a 28 6b 65 79 4f 62 6a 2c 20 FromObj(keyObj,
7490: 26 6b 65 79 5f 6c 65 6e 29 3b 0a 09 68 6d 61 63 &key_len);..hmac
74a0: 20 3d 20 48 4d 41 43 28 6d 64 2c 20 28 63 6f 6e = HMAC(md, (con
74b0: 73 74 20 76 6f 69 64 20 2a 29 20 6b 65 79 2c 20 st void *) key,
74c0: 6b 65 79 5f 6c 65 6e 2c 20 28 63 6f 6e 73 74 20 key_len, (const
74d0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 unsigned char *)
74e0: 20 64 61 74 61 2c 0a 09 20 20 20 20 28 73 69 7a data,.. (siz
74f0: 65 5f 74 29 20 6c 65 6e 2c 20 6d 64 5f 62 75 66 e_t) len, md_buf
7500: 2c 20 26 6d 64 5f 6c 65 6e 29 3b 0a 09 72 65 73 , &md_len);..res
7510: 20 3d 20 28 68 6d 61 63 20 21 3d 20 4e 55 4c 4c = (hmac != NULL
7520: 29 3b 0a 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 );.. } else i
7530: 66 20 28 66 6f 72 6d 61 74 20 26 20 54 59 50 45 f (format & TYPE
7540: 5f 43 4d 41 43 29 20 7b 0a 09 44 69 67 65 73 74 _CMAC) {..Digest
7550: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b State *statePtr;
7560: 0a 0a 09 69 66 20 28 28 73 74 61 74 65 50 74 72 ...if ((statePtr
7570: 20 3d 20 54 6c 73 5f 44 69 67 65 73 74 4e 65 77 = Tls_DigestNew
7580: 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74 29 (interp, format)
7590: 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 ) == NULL) {..
75a0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 Tcl_AppendResu
75b0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 4d 65 6d 6f lt(interp, "Memo
75c0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 ry allocation er
75d0: 72 6f 72 22 2c 20 28 63 68 61 72 20 2a 29 20 4e ror", (char *) N
75e0: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 ULL);.. retur
75f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
7600: 09 69 66 20 28 54 6c 73 5f 44 69 67 65 73 74 49 .if (Tls_DigestI
7610: 6e 69 74 28 69 6e 74 65 72 70 2c 20 73 74 61 74 nit(interp, stat
7620: 65 50 74 72 2c 20 6d 64 2c 20 63 69 70 68 65 72 ePtr, md, cipher
7630: 2c 20 6b 65 79 4f 62 6a 29 20 21 3d 20 54 43 4c , keyObj) != TCL
7640: 5f 4f 4b 20 7c 7c 0a 09 20 20 20 20 54 6c 73 5f _OK ||.. Tls_
7650: 44 69 67 65 73 74 55 70 64 61 74 65 28 73 74 61 DigestUpdate(sta
7660: 74 65 50 74 72 2c 20 64 61 74 61 2c 20 28 73 69 tePtr, data, (si
7670: 7a 65 5f 74 29 20 6c 65 6e 2c 20 31 29 20 3d 3d ze_t) len, 1) ==
7680: 20 30 20 7c 7c 0a 09 20 20 20 20 54 6c 73 5f 44 0 ||.. Tls_D
7690: 69 67 65 73 74 46 69 6e 69 61 6c 69 7a 65 28 69 igestFinialize(i
76a0: 6e 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 29 nterp, statePtr)
76b0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 != TCL_OK) {..
76c0: 20 20 20 54 6c 73 5f 44 69 67 65 73 74 46 72 65 Tls_DigestFre
76d0: 65 28 73 74 61 74 65 50 74 72 29 3b 0a 09 20 20 e(statePtr);..
76e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 return TCL_ERR
76f0: 4f 52 3b 0a 09 7d 0a 09 54 6c 73 5f 44 69 67 65 OR;..}..Tls_Dige
7700: 73 74 46 72 65 65 28 73 74 61 74 65 50 74 72 29 stFree(statePtr)
7710: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b ;..return TCL_OK
7720: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
7730: 4f 75 74 70 75 74 20 64 69 67 65 73 74 20 74 6f Output digest to
7740: 20 72 65 73 75 6c 74 20 70 65 72 20 66 6f 72 6d result per form
7750: 61 74 20 28 62 69 6e 20 6f 72 20 68 65 78 29 20 at (bin or hex)
7760: 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 73 29 20 */. if (res)
7770: 7b 0a 09 69 66 20 28 66 6f 72 6d 61 74 20 26 20 {..if (format &
7780: 42 49 4e 5f 46 4f 52 4d 41 54 29 20 7b 0a 09 20 BIN_FORMAT) {..
7790: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 Tcl_SetObjRes
77a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f ult(interp, Tcl_
77b0: 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 NewByteArrayObj(
77c0: 6d 64 5f 62 75 66 2c 20 6d 64 5f 6c 65 6e 29 29 md_buf, md_len))
77d0: 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 ;...} else {..
77e0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c Tcl_Obj *resul
77f0: 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 tObj = Tcl_NewOb
7800: 6a 28 29 3b 0a 09 20 20 20 20 75 6e 73 69 67 6e j();.. unsign
7810: 65 64 20 63 68 61 72 20 2a 70 74 72 20 3d 20 54 ed char *ptr = T
7820: 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 4c cl_SetByteArrayL
7830: 65 6e 67 74 68 28 72 65 73 75 6c 74 4f 62 6a 2c ength(resultObj,
7840: 20 6d 64 5f 6c 65 6e 2a 32 29 3b 0a 0a 09 20 20 md_len*2);...
7850: 20 20 66 6f 72 20 28 75 6e 73 69 67 6e 65 64 20 for (unsigned
7860: 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 6d int i = 0; i < m
7870: 64 5f 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 09 d_len; i++) {...
7880: 2a 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 6d 64 *ptr++ = hex[(md
7890: 5f 62 75 66 5b 69 5d 20 3e 3e 20 34 29 20 26 20 _buf[i] >> 4) &
78a0: 30 78 30 46 5d 3b 0a 09 09 2a 70 74 72 2b 2b 20 0x0F];...*ptr++
78b0: 3d 20 68 65 78 5b 6d 64 5f 62 75 66 5b 69 5d 20 = hex[md_buf[i]
78c0: 26 20 30 78 30 46 5d 3b 0a 09 20 20 20 20 7d 0a & 0x0F];.. }.
78d0: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c .Tcl_SetObjResul
78e0: 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 t(interp, result
78f0: 4f 62 6a 29 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 Obj);..}.. }
7900: 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 41 70 70 65 else {..Tcl_Appe
7910: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
7920: 20 22 48 61 73 68 20 63 61 6c 63 75 6c 61 74 69 "Hash calculati
7930: 6f 6e 20 65 72 72 6f 72 3a 22 2c 20 52 45 41 53 on error:", REAS
7940: 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 4e ON(), (char *) N
7950: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ULL);..return TC
7960: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
7970: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
7980: 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a ;.}.../*********
7990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
79a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
79b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
79c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a **********/../*.
79d0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
79e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
79f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a10: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 -----. *. * Dige
7a20: 73 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 stObjCmd --. *.
7a30: 2a 09 52 65 74 75 72 6e 20 6d 65 73 73 61 67 65 *.Return message
7a40: 20 64 69 67 65 73 74 20 75 73 69 6e 67 20 75 73 digest using us
7a50: 65 72 20 73 70 65 63 69 66 69 65 64 20 68 61 73 er specified has
7a60: 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 h function.. *.
7a70: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 * Returns:. *.TC
7a80: 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f L_OK or TCL_ERRO
7a90: 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 R. *. * Side eff
7aa0: 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 65 ects:. *.Sets re
7ab0: 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 67 65 20 sult to message
7ac0: 64 69 67 65 73 74 20 6f 72 20 65 72 72 6f 72 20 digest or error
7ad0: 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d message. *. *---
7ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b20: 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 . */.static int
7b30: 44 69 67 65 73 74 4d 61 69 6e 28 69 6e 74 20 74 DigestMain(int t
7b40: 79 70 65 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ype, Tcl_Interp
7b50: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
7b60: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
7b70: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
7b80: 69 6e 74 20 69 64 78 2c 20 6c 65 6e 2c 20 66 6f int idx, len, fo
7b90: 72 6d 61 74 20 3d 20 48 45 58 5f 46 4f 52 4d 41 rmat = HEX_FORMA
7ba0: 54 2c 20 72 65 73 20 3d 20 54 43 4c 5f 4f 4b 2c T, res = TCL_OK,
7bb0: 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 flags = 0;.
7bc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 69 67 65 const char *dige
7bd0: 73 74 4e 61 6d 65 2c 20 2a 63 68 61 6e 6e 65 6c stName, *channel
7be0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c = NULL;. Tcl
7bf0: 5f 4f 62 6a 20 2a 63 6d 64 4f 62 6a 20 3d 20 4e _Obj *cmdObj = N
7c00: 55 4c 4c 2c 20 2a 64 61 74 61 4f 62 6a 20 3d 20 ULL, *dataObj =
7c10: 4e 55 4c 4c 2c 20 2a 66 69 6c 65 4f 62 6a 20 3d NULL, *fileObj =
7c20: 20 4e 55 4c 4c 2c 20 2a 6b 65 79 4f 62 6a 20 3d NULL, *keyObj =
7c30: 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67 NULL;. unsig
7c40: 6e 65 64 20 63 68 61 72 20 2a 63 69 70 68 65 72 ned char *cipher
7c50: 4e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 Name = NULL;.
7c60: 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d const EVP_MD *m
7c70: 64 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 d;. const EVP
7c80: 5f 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 20 _CIPHER *cipher
7c90: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a 20 = NULL;.. /*
7ca0: 43 6c 65 61 72 20 69 6e 74 65 72 70 20 72 65 73 Clear interp res
7cb0: 75 6c 74 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 52 ult */. Tcl_R
7cc0: 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 esetResult(inter
7cd0: 70 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 p);.. /* Vali
7ce0: 64 61 74 65 20 61 72 67 20 63 6f 75 6e 74 20 2a date arg count *
7cf0: 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c /. if (objc <
7d00: 20 33 20 7c 7c 20 6f 62 6a 63 20 3e 20 39 29 20 3 || objc > 9)
7d10: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 {..Tcl_WrongNumA
7d20: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f rgs(interp, 1, o
7d30: 62 6a 76 2c 20 22 64 69 67 65 73 74 20 3f 2d 62 bjv, "digest ?-b
7d40: 69 6e 7c 2d 68 65 78 3f 20 3f 2d 63 69 70 68 65 in|-hex? ?-ciphe
7d50: 72 20 6e 61 6d 65 3f 20 3f 2d 6b 65 79 20 68 6d r name? ?-key hm
7d60: 61 63 5f 6b 65 79 3f 20 5b 2d 63 68 61 6e 6e 65 ac_key? [-channe
7d70: 6c 20 63 68 61 6e 20 7c 20 2d 63 6f 6d 6d 61 6e l chan | -comman
7d80: 64 20 63 6d 64 4e 61 6d 65 20 7c 20 2d 66 69 6c d cmdName | -fil
7d90: 65 20 66 69 6c 65 6e 61 6d 65 20 7c 20 3f 2d 64 e filename | ?-d
7da0: 61 74 61 3f 20 64 61 74 61 5d 22 29 3b 0a 09 72 ata? data]");..r
7db0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
7dc0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 . }.. /* G
7dd0: 65 74 20 64 69 67 65 73 74 20 2a 2f 0a 20 20 20 et digest */.
7de0: 20 64 69 67 65 73 74 4e 61 6d 65 20 3d 20 54 63 digestName = Tc
7df0: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
7e00: 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 26 6c 65 6e bj(objv[1], &len
7e10: 29 3b 0a 20 20 20 20 69 66 20 28 64 69 67 65 73 );. if (diges
7e20: 74 4e 61 6d 65 20 3d 3d 20 4e 55 4c 4c 20 7c 7c tName == NULL ||
7e30: 20 28 6d 64 20 3d 20 45 56 50 5f 67 65 74 5f 64 (md = EVP_get_d
7e40: 69 67 65 73 74 62 79 6e 61 6d 65 28 64 69 67 65 igestbyname(dige
7e50: 73 74 4e 61 6d 65 29 29 20 3d 3d 20 4e 55 4c 4c stName)) == NULL
7e60: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
7e70: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 esult(interp, "I
7e80: 6e 76 61 6c 69 64 20 64 69 67 65 73 74 20 5c 22 nvalid digest \"
7e90: 22 2c 20 64 69 67 65 73 74 4e 61 6d 65 2c 20 22 ", digestName, "
7ea0: 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 \"", NULL);..ret
7eb0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
7ec0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 74 }.. /* Opt
7ed0: 69 6d 61 6c 20 63 61 73 65 20 66 6f 72 20 62 6c imal case for bl
7ee0: 6f 62 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 ob of data */.
7ef0: 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 33 20 if (objc == 3
7f00: 26 26 20 74 79 70 65 20 3d 3d 20 54 59 50 45 5f && type == TYPE_
7f10: 4d 44 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 6c MD) {..return Tl
7f20: 73 5f 44 69 67 65 73 74 44 61 74 61 28 69 6e 74 s_DigestData(int
7f30: 65 72 70 2c 20 2d 2d 6f 62 6a 63 2c 20 2b 2b 6f erp, --objc, ++o
7f40: 62 6a 76 2c 20 6d 64 2c 20 4e 55 4c 4c 2c 20 48 bjv, md, NULL, H
7f50: 45 58 5f 46 4f 52 4d 41 54 20 7c 20 54 59 50 45 EX_FORMAT | TYPE
7f60: 5f 4d 44 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 _MD, NULL);.
7f70: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6f 70 }.. /* Get op
7f80: 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 66 6f 72 tions */. for
7f90: 20 28 69 64 78 20 3d 20 32 3b 20 69 64 78 20 3c (idx = 2; idx <
7fa0: 20 6f 62 6a 63 2d 31 3b 20 69 64 78 2b 2b 29 20 objc-1; idx++)
7fb0: 7b 0a 09 63 68 61 72 20 2a 6f 70 74 20 3d 20 54 {..char *opt = T
7fc0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
7fd0: 4f 62 6a 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 4e Obj(objv[idx], N
7fe0: 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 6f 70 74 5b ULL);...if (opt[
7ff0: 30 5d 20 21 3d 20 27 2d 27 29 20 7b 0a 09 20 20 0] != '-') {..
8000: 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 4f 50 break;..}...OP
8010: 54 46 4c 41 47 28 22 2d 62 69 6e 22 2c 20 66 6f TFLAG("-bin", fo
8020: 72 6d 61 74 2c 20 42 49 4e 5f 46 4f 52 4d 41 54 rmat, BIN_FORMAT
8030: 29 3b 0a 09 4f 50 54 46 4c 41 47 28 22 2d 62 69 );..OPTFLAG("-bi
8040: 6e 61 72 79 22 2c 20 66 6f 72 6d 61 74 2c 20 42 nary", format, B
8050: 49 4e 5f 46 4f 52 4d 41 54 29 3b 0a 09 4f 50 54 IN_FORMAT);..OPT
8060: 46 4c 41 47 28 22 2d 68 65 78 22 2c 20 66 6f 72 FLAG("-hex", for
8070: 6d 61 74 2c 20 48 45 58 5f 46 4f 52 4d 41 54 29 mat, HEX_FORMAT)
8080: 3b 0a 09 4f 50 54 46 4c 41 47 28 22 2d 68 65 78 ;..OPTFLAG("-hex
8090: 61 64 65 63 69 6d 61 6c 22 2c 20 66 6f 72 6d 61 adecimal", forma
80a0: 74 2c 20 48 45 58 5f 46 4f 52 4d 41 54 29 3b 0a t, HEX_FORMAT);.
80b0: 09 4f 50 54 53 54 52 28 22 2d 63 68 61 6e 22 2c .OPTSTR("-chan",
80c0: 20 63 68 61 6e 6e 65 6c 29 3b 0a 09 4f 50 54 53 channel);..OPTS
80d0: 54 52 28 22 2d 63 68 61 6e 6e 65 6c 22 2c 20 63 TR("-channel", c
80e0: 68 61 6e 6e 65 6c 29 3b 0a 09 4f 50 54 53 54 52 hannel);..OPTSTR
80f0: 28 22 2d 63 69 70 68 65 72 22 2c 20 63 69 70 68 ("-cipher", ciph
8100: 65 72 4e 61 6d 65 29 3b 0a 09 4f 50 54 4f 42 4a erName);..OPTOBJ
8110: 28 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 63 6d 64 ("-command", cmd
8120: 4f 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d Obj);..OPTOBJ("-
8130: 64 61 74 61 22 2c 20 64 61 74 61 4f 62 6a 29 3b data", dataObj);
8140: 0a 09 4f 50 54 4f 42 4a 28 22 2d 66 69 6c 65 22 ..OPTOBJ("-file"
8150: 2c 20 66 69 6c 65 4f 62 6a 29 3b 0a 09 4f 50 54 , fileObj);..OPT
8160: 4f 42 4a 28 22 2d 66 69 6c 65 6e 61 6d 65 22 2c OBJ("-filename",
8170: 20 66 69 6c 65 4f 62 6a 29 3b 0a 09 4f 50 54 4f fileObj);..OPTO
8180: 42 4a 28 22 2d 6b 65 79 22 2c 20 6b 65 79 4f 62 BJ("-key", keyOb
8190: 6a 29 3b 0a 0a 09 4f 50 54 42 41 44 28 22 6f 70 j);...OPTBAD("op
81a0: 74 69 6f 6e 22 2c 20 22 2d 62 69 6e 2c 20 2d 63 tion", "-bin, -c
81b0: 68 61 6e 6e 65 6c 2c 20 2d 63 69 70 68 65 72 2c hannel, -cipher,
81c0: 20 2d 63 6f 6d 6d 61 6e 64 2c 20 2d 64 61 74 61 -command, -data
81d0: 2c 20 2d 66 69 6c 65 2c 20 2d 66 69 6c 65 6e 61 , -file, -filena
81e0: 6d 65 2c 20 2d 68 65 78 2c 20 6f 72 20 2d 6b 65 me, -hex, or -ke
81f0: 79 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c y");..return TCL
8200: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
8210: 20 20 20 2f 2a 20 49 66 20 6e 6f 20 6f 70 74 69 /* If no opti
8220: 6f 6e 20 66 6f 72 20 6c 61 73 74 20 61 72 67 2c on for last arg,
8230: 20 74 68 65 6e 20 69 74 73 20 74 68 65 20 64 61 then its the da
8240: 74 61 20 2a 2f 0a 20 20 20 20 69 66 20 28 69 64 ta */. if (id
8250: 78 20 3c 20 6f 62 6a 63 29 20 7b 0a 09 64 61 74 x < objc) {..dat
8260: 61 4f 62 6a 20 3d 20 6f 62 6a 76 5b 69 64 78 5d aObj = objv[idx]
8270: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
8280: 47 65 74 20 63 69 70 68 65 72 20 2a 2f 0a 20 20 Get cipher */.
8290: 20 20 69 66 20 28 63 69 70 68 65 72 4e 61 6d 65 if (cipherName
82a0: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 69 70 != NULL) {..cip
82b0: 68 65 72 20 3d 20 45 56 50 5f 67 65 74 5f 63 69 her = EVP_get_ci
82c0: 70 68 65 72 62 79 6e 61 6d 65 28 63 69 70 68 65 pherbyname(ciphe
82d0: 72 4e 61 6d 65 29 3b 0a 09 74 79 70 65 20 3d 20 rName);..type =
82e0: 54 59 50 45 5f 43 4d 41 43 3b 0a 09 69 66 20 28 TYPE_CMAC;..if (
82f0: 63 69 70 68 65 72 20 3d 3d 20 4e 55 4c 4c 29 20 cipher == NULL)
8300: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e {.. Tcl_Appen
8310: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 dResult(interp,
8320: 22 49 6e 76 61 6c 69 64 20 63 69 70 68 65 72 20 "Invalid cipher
8330: 5c 22 22 2c 20 63 69 70 68 65 72 4e 61 6d 65 2c \"", cipherName,
8340: 20 22 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 "\"", NULL);..
8350: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 return TCL_ER
8360: 52 4f 52 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 65 ROR;..}.. } e
8370: 6c 73 65 20 69 66 20 28 74 79 70 65 20 3d 3d 20 lse if (type ==
8380: 54 59 50 45 5f 43 4d 41 43 29 20 7b 0a 09 54 63 TYPE_CMAC) {..Tc
8390: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
83a0: 6e 74 65 72 70 2c 20 22 4e 6f 20 63 69 70 68 65 nterp, "No ciphe
83b0: 72 20 73 70 65 63 69 66 69 65 64 22 2c 20 4e 55 r specified", NU
83c0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
83d0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
83e0: 20 20 20 2f 2a 20 47 65 74 20 6b 65 79 20 2a 2f /* Get key */
83f0: 0a 20 20 20 20 69 66 20 28 6b 65 79 4f 62 6a 20 . if (keyObj
8400: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 != NULL) {..if (
8410: 74 79 70 65 20 3d 3d 20 54 59 50 45 5f 4d 44 29 type == TYPE_MD)
8420: 20 7b 0a 09 20 20 20 20 74 79 70 65 20 3d 20 54 {.. type = T
8430: 59 50 45 5f 48 4d 41 43 3b 0a 09 7d 0a 20 20 20 YPE_HMAC;..}.
8440: 20 7d 20 65 6c 73 65 20 69 66 20 28 74 79 70 65 } else if (type
8450: 20 21 3d 20 54 59 50 45 5f 4d 44 29 20 7b 0a 09 != TYPE_MD) {..
8460: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
8470: 28 69 6e 74 65 72 70 2c 20 22 4e 6f 20 6b 65 79 (interp, "No key
8480: 20 73 70 65 63 69 66 69 65 64 22 2c 20 4e 55 4c specified", NUL
8490: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
84a0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
84b0: 20 20 2f 2a 20 43 61 6c 63 20 64 69 67 65 73 74 /* Calc digest
84c0: 20 6f 6e 20 66 69 6c 65 2c 20 73 74 61 63 6b 65 on file, stacke
84d0: 64 20 63 68 61 6e 6e 65 6c 2c 20 75 73 69 6e 67 d channel, using
84e0: 20 69 6e 73 74 61 6e 63 65 20 63 6f 6d 6d 61 6e instance comman
84f0: 64 2c 20 6f 72 20 64 61 74 61 20 62 6c 6f 62 20 d, or data blob
8500: 2a 2f 0a 20 20 20 20 69 66 20 28 66 69 6c 65 4f */. if (fileO
8510: 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 bj != NULL) {..r
8520: 65 73 20 3d 20 54 6c 73 5f 44 69 67 65 73 74 46 es = Tls_DigestF
8530: 69 6c 65 28 69 6e 74 65 72 70 2c 20 66 69 6c 65 ile(interp, file
8540: 4f 62 6a 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c Obj, md, cipher,
8550: 20 66 6f 72 6d 61 74 20 7c 20 74 79 70 65 2c 20 format | type,
8560: 6b 65 79 4f 62 6a 29 3b 0a 20 20 20 20 7d 20 65 keyObj);. } e
8570: 6c 73 65 20 69 66 20 28 63 68 61 6e 6e 65 6c 20 lse if (channel
8580: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 != NULL) {..res
8590: 3d 20 54 6c 73 5f 44 69 67 65 73 74 43 68 61 6e = Tls_DigestChan
85a0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e nel(interp, chan
85b0: 6e 65 6c 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c nel, md, cipher,
85c0: 20 66 6f 72 6d 61 74 20 7c 20 74 79 70 65 2c 20 format | type,
85d0: 6b 65 79 4f 62 6a 29 3b 0a 20 20 20 20 7d 20 65 keyObj);. } e
85e0: 6c 73 65 20 69 66 20 28 63 6d 64 4f 62 6a 20 21 lse if (cmdObj !
85f0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d = NULL) {..res =
8600: 20 54 6c 73 5f 44 69 67 65 73 74 49 6e 73 74 61 Tls_DigestInsta
8610: 6e 63 65 28 69 6e 74 65 72 70 2c 20 63 6d 64 4f nce(interp, cmdO
8620: 62 6a 2c 20 6d 64 2c 20 63 69 70 68 65 72 2c 20 bj, md, cipher,
8630: 66 6f 72 6d 61 74 20 7c 20 74 79 70 65 2c 20 6b format | type, k
8640: 65 79 4f 62 6a 29 3b 0a 20 20 20 20 7d 20 65 6c eyObj);. } el
8650: 73 65 20 69 66 20 28 64 61 74 61 4f 62 6a 20 21 se if (dataObj !
8660: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 4f = NULL) {..Tcl_O
8670: 62 6a 20 2a 6f 62 6a 73 5b 32 5d 3b 0a 09 6f 62 bj *objs[2];..ob
8680: 6a 73 5b 30 5d 20 3d 20 4e 55 4c 4c 3b 0a 09 6f js[0] = NULL;..o
8690: 62 6a 73 5b 31 5d 20 3d 20 64 61 74 61 4f 62 6a bjs[1] = dataObj
86a0: 3b 0a 09 72 65 73 20 3d 20 54 6c 73 5f 44 69 67 ;..res = Tls_Dig
86b0: 65 73 74 44 61 74 61 28 69 6e 74 65 72 70 2c 20 estData(interp,
86c0: 32 2c 20 6f 62 6a 73 2c 20 6d 64 2c 20 63 69 70 2, objs, md, cip
86d0: 68 65 72 2c 20 66 6f 72 6d 61 74 20 7c 20 74 79 her, format | ty
86e0: 70 65 2c 20 6b 65 79 4f 62 6a 29 3b 0a 20 20 20 pe, keyObj);.
86f0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 }. return re
8700: 73 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d s;.}../*. *-----
8710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
8750: 2a 0a 20 2a 20 4d 65 73 73 61 67 65 20 44 69 67 *. * Message Dig
8760: 65 73 74 20 61 6e 64 20 4d 65 73 73 61 67 65 20 est and Message
8770: 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e 20 43 Authentication C
8780: 6f 64 65 20 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a ode Commands --.
8790: 20 2a 0a 20 2a 09 52 65 74 75 72 6e 20 4d 65 73 *. *.Return Mes
87a0: 73 61 67 65 20 44 69 67 65 73 74 20 28 4d 44 29 sage Digest (MD)
87b0: 20 6f 72 20 4d 65 73 73 61 67 65 20 41 75 74 68 or Message Auth
87c0: 65 6e 74 69 63 61 74 69 6f 6e 20 43 6f 64 65 20 entication Code
87d0: 28 4d 41 43 29 2e 0a 20 2a 0a 20 2a 20 52 65 74 (MAC).. *. * Ret
87e0: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 urns:. *.TCL_OK
87f0: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a or TCL_ERROR. *.
8800: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
8810: 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 20 . *.Sets result
8820: 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 to message diges
8830: 74 20 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 t or error messa
8840: 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ge. *. *--------
8850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
8890: 73 74 61 74 69 63 20 69 6e 74 20 44 69 67 65 73 static int Diges
88a0: 74 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 tObjCmd(ClientDa
88b0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
88c0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
88d0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
88e0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
88f0: 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e []) {. return
8900: 20 44 69 67 65 73 74 4d 61 69 6e 28 54 59 50 45 DigestMain(TYPE
8910: 5f 4d 44 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a _MD, interp, obj
8920: 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 0a 73 74 61 c, objv);.}..sta
8930: 74 69 63 20 69 6e 74 20 43 4d 41 43 4f 62 6a 43 tic int CMACObjC
8940: 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c md(ClientData cl
8950: 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e ientData, Tcl_In
8960: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e terp *interp, in
8970: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
8980: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b *const objv[]) {
8990: 0a 20 20 20 20 72 65 74 75 72 6e 20 44 69 67 65 . return Dige
89a0: 73 74 4d 61 69 6e 28 54 59 50 45 5f 43 4d 41 43 stMain(TYPE_CMAC
89b0: 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 , interp, objc,
89c0: 6f 62 6a 76 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 objv);.}..static
89d0: 20 69 6e 74 20 48 4d 41 43 4f 62 6a 43 6d 64 28 int HMACObjCmd(
89e0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
89f0: 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 tData, Tcl_Inter
8a00: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f p *interp, int o
8a10: 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f bjc, Tcl_Obj *co
8a20: 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 nst objv[]) {.
8a30: 20 20 72 65 74 75 72 6e 20 44 69 67 65 73 74 4d return DigestM
8a40: 61 69 6e 28 54 59 50 45 5f 48 4d 41 43 2c 20 69 ain(TYPE_HMAC, i
8a50: 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a nterp, objc, obj
8a60: 76 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d v);.}../*. *----
8a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
8ab0: 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65 20 44 69 *. * Message Di
8ac0: 67 65 73 74 20 43 6f 6e 76 65 6e 69 65 6e 63 65 gest Convenience
8ad0: 20 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a Commands --. *.
8ae0: 20 2a 09 43 6f 6e 76 65 6e 69 65 6e 63 65 20 63 *.Convenience c
8af0: 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 73 65 6c 65 ommands for sele
8b00: 63 74 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 ct message diges
8b10: 74 73 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e ts.. *. * Return
8b20: 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 s:. *.TCL_OK or
8b30: 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 TCL_ERROR. *. *
8b40: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
8b50: 09 53 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 .Sets result to
8b60: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 6f message digest o
8b70: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a r error message.
8b80: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
8b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8bc0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 --------. */.int
8bd0: 20 44 69 67 65 73 74 4d 44 34 43 6d 64 28 43 6c DigestMD4Cmd(Cl
8be0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
8bf0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
8c00: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
8c10: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
8c20: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
8c30: 72 65 74 75 72 6e 20 54 6c 73 5f 44 69 67 65 73 return Tls_Diges
8c40: 74 44 61 74 61 28 69 6e 74 65 72 70 2c 20 6f 62 tData(interp, ob
8c50: 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 50 5f 6d 64 jc, objv, EVP_md
8c60: 34 28 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f 46 4(), NULL, HEX_F
8c70: 4f 52 4d 41 54 20 7c 20 54 59 50 45 5f 4d 44 2c ORMAT | TYPE_MD,
8c80: 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 44 NULL);.}..int D
8c90: 69 67 65 73 74 4d 44 35 43 6d 64 28 43 6c 69 65 igestMD5Cmd(Clie
8ca0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
8cb0: 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 a, Tcl_Interp *i
8cc0: 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c nterp, int objc,
8cd0: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
8ce0: 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 objv[]) {. re
8cf0: 74 75 72 6e 20 54 6c 73 5f 44 69 67 65 73 74 44 turn Tls_DigestD
8d00: 61 74 61 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 ata(interp, objc
8d10: 2c 20 6f 62 6a 76 2c 20 45 56 50 5f 6d 64 35 28 , objv, EVP_md5(
8d20: 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f 46 4f 52 ), NULL, HEX_FOR
8d30: 4d 41 54 20 7c 20 54 59 50 45 5f 4d 44 2c 20 4e MAT | TYPE_MD, N
8d40: 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 44 69 67 ULL);.}..int Dig
8d50: 65 73 74 53 48 41 31 43 6d 64 28 43 6c 69 65 6e estSHA1Cmd(Clien
8d60: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
8d70: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
8d80: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
8d90: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
8da0: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 bjv[]) {. ret
8db0: 75 72 6e 20 54 6c 73 5f 44 69 67 65 73 74 44 61 urn Tls_DigestDa
8dc0: 74 61 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c ta(interp, objc,
8dd0: 20 6f 62 6a 76 2c 20 45 56 50 5f 73 68 61 31 28 objv, EVP_sha1(
8de0: 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 5f 46 4f 52 ), NULL, HEX_FOR
8df0: 4d 41 54 20 7c 20 54 59 50 45 5f 4d 44 2c 20 4e MAT | TYPE_MD, N
8e00: 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 44 69 67 ULL);.}..int Dig
8e10: 65 73 74 53 48 41 32 35 36 43 6d 64 28 43 6c 69 estSHA256Cmd(Cli
8e20: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
8e30: 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a ta, Tcl_Interp *
8e40: 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 interp, int objc
8e50: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
8e60: 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 objv[]) {. r
8e70: 65 74 75 72 6e 20 54 6c 73 5f 44 69 67 65 73 74 eturn Tls_Digest
8e80: 44 61 74 61 28 69 6e 74 65 72 70 2c 20 6f 62 6a Data(interp, obj
8e90: 63 2c 20 6f 62 6a 76 2c 20 45 56 50 5f 73 68 61 c, objv, EVP_sha
8ea0: 32 35 36 28 29 2c 20 4e 55 4c 4c 2c 20 48 45 58 256(), NULL, HEX
8eb0: 5f 46 4f 52 4d 41 54 20 7c 20 54 59 50 45 5f 4d _FORMAT | TYPE_M
8ec0: 44 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 69 6e 74 D, NULL);.}..int
8ed0: 20 44 69 67 65 73 74 53 48 41 35 31 32 43 6d 64 DigestSHA512Cmd
8ee0: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
8ef0: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 ntData, Tcl_Inte
8f00: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 rp *interp, int
8f10: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
8f20: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 onst objv[]) {.
8f30: 20 20 20 72 65 74 75 72 6e 20 54 6c 73 5f 44 69 return Tls_Di
8f40: 67 65 73 74 44 61 74 61 28 69 6e 74 65 72 70 2c gestData(interp,
8f50: 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 45 56 50 objc, objv, EVP
8f60: 5f 73 68 61 35 31 32 28 29 2c 20 4e 55 4c 4c 2c _sha512(), NULL,
8f70: 20 48 45 58 5f 46 4f 52 4d 41 54 20 7c 20 54 59 HEX_FORMAT | TY
8f80: 50 45 5f 4d 44 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a PE_MD, NULL);.}.
8f90: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
8fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
8fe0: 54 6c 73 5f 44 69 67 65 73 74 43 6f 6d 6d 61 6e Tls_DigestComman
8ff0: 64 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 ds --. *. *.Crea
9000: 74 65 20 64 69 67 65 73 74 20 63 6f 6d 6d 61 6e te digest comman
9010: 64 73 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 ds. *. * Returns
9020: 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 :. *.TCL_OK or T
9030: 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 CL_ERROR. *. * S
9040: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
9050: 43 72 65 61 74 65 73 20 63 6f 6d 6d 61 6e 64 73 Creates commands
9060: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
9070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
90a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e ---------. */.in
90b0: 74 20 54 6c 73 5f 44 69 67 65 73 74 43 6f 6d 6d t Tls_DigestComm
90c0: 61 6e 64 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 ands(Tcl_Interp
90d0: 2a 69 6e 74 65 72 70 29 20 7b 0a 20 20 20 20 54 *interp) {. T
90e0: 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d cl_CreateObjComm
90f0: 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 and(interp, "tls
9100: 3a 3a 64 69 67 65 73 74 22 2c 20 44 69 67 65 73 ::digest", Diges
9110: 74 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 tObjCmd, (Client
9120: 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d Data) 0, (Tcl_Cm
9130: 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
9140: 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
9150: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
9160: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 63 6d 61 nterp, "tls::cma
9170: 63 22 2c 20 43 4d 41 43 4f 62 6a 43 6d 64 2c 20 c", CMACObjCmd,
9180: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 (ClientData) 0,
9190: 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 (Tcl_CmdDeletePr
91a0: 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 oc *) NULL);.
91b0: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f Tcl_CreateObjCo
91c0: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 mmand(interp, "t
91d0: 6c 73 3a 3a 68 6d 61 63 22 2c 20 48 4d 41 43 4f ls::hmac", HMACO
91e0: 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 bjCmd, (ClientDa
91f0: 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
9200: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
9210: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
9220: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
9230: 65 72 70 2c 20 22 74 6c 73 3a 3a 6d 64 34 22 2c erp, "tls::md4",
9240: 20 44 69 67 65 73 74 4d 44 34 43 6d 64 2c 20 28 DigestMD4Cmd, (
9250: 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 ClientData) 0, (
9260: 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
9270: 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
9280: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
9290: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
92a0: 73 3a 3a 6d 64 35 22 2c 20 44 69 67 65 73 74 4d s::md5", DigestM
92b0: 44 35 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 D5Cmd, (ClientDa
92c0: 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 ta) 0, (Tcl_CmdD
92d0: 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c eleteProc *) NUL
92e0: 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61 L);. Tcl_Crea
92f0: 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 teObjCommand(int
9300: 65 72 70 2c 20 22 74 6c 73 3a 3a 73 68 61 31 22 erp, "tls::sha1"
9310: 2c 20 44 69 67 65 73 74 53 48 41 31 43 6d 64 2c , DigestSHA1Cmd,
9320: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c (ClientData) 0,
9330: 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 (Tcl_CmdDeleteP
9340: 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 roc *) NULL);.
9350: 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 Tcl_CreateObjC
9360: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 ommand(interp, "
9370: 74 6c 73 3a 3a 73 68 61 32 35 36 22 2c 20 44 69 tls::sha256", Di
9380: 67 65 73 74 53 48 41 32 35 36 43 6d 64 2c 20 28 gestSHA256Cmd, (
9390: 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 ClientData) 0, (
93a0: 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f Tcl_CmdDeletePro
93b0: 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 c *) NULL);.
93c0: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
93d0: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c mand(interp, "tl
93e0: 73 3a 3a 73 68 61 35 31 32 22 2c 20 44 69 67 65 s::sha512", Dige
93f0: 73 74 53 48 41 35 31 32 43 6d 64 2c 20 28 43 6c stSHA512Cmd, (Cl
9400: 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
9410: 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
9420: 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
9430: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
9440: 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
9450: 3a 75 6e 73 74 61 63 6b 22 2c 20 55 6e 73 74 61 :unstack", Unsta
9460: 63 6b 4f 62 6a 43 6d 64 2c 20 28 43 6c 69 65 6e ckObjCmd, (Clien
9470: 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 tData) 0, (Tcl_C
9480: 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 mdDeleteProc *)
9490: 4e 55 4c 4c 29 3b 0a 20 20 20 20 72 65 74 75 72 NULL);. retur
94a0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a n TCL_OK;.}..