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 61 6c 67 6f 72 69 fied hash algori
0070: 74 68 6d 2e 0a 20 2a 0a 20 2a 20 43 6f 70 79 72 thm.. *. * Copyr
0080: 69 67 68 74 20 28 43 29 20 32 30 32 33 20 42 72 ight (C) 2023 Br
0090: 69 61 6e 20 4f 27 48 61 67 61 6e 0a 20 2a 0a 20 ian O'Hagan. *.
00a0: 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c */..#include "tl
00b0: 73 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 sInt.h".#include
00c0: 20 22 74 63 6c 4f 70 74 73 2e 68 22 0a 23 69 6e "tclOpts.h".#in
00d0: 63 6c 75 64 65 20 3c 74 63 6c 2e 68 3e 0a 23 69 clude <tcl.h>.#i
00e0: 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e nclude <stdio.h>
00f0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e .#include <strin
0100: 67 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f g.h>.#include <o
0110: 70 65 6e 73 73 6c 2f 65 76 70 2e 68 3e 0a 0a 2f penssl/evp.h>../
0120: 2a 20 43 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 63 * Constants */.c
0130: 6f 6e 73 74 20 63 68 61 72 20 2a 68 65 78 20 3d onst char *hex =
0140: 20 22 30 31 32 33 34 35 36 37 38 39 41 42 43 44 "0123456789ABCD
0150: 45 46 22 3b 0a 0a 2f 2a 20 4d 61 63 72 6f 73 20 EF";../* Macros
0160: 2a 2f 0a 23 64 65 66 69 6e 65 20 42 55 46 46 45 */.#define BUFFE
0170: 52 5f 53 49 5a 45 20 36 35 35 33 36 0a 23 64 65 R_SIZE 65536.#de
0180: 66 69 6e 65 20 42 49 4e 5f 46 4f 52 4d 41 54 20 fine BIN_FORMAT
0190: 30 0a 23 64 65 66 69 6e 65 20 48 45 58 5f 46 4f 0.#define HEX_FO
01a0: 52 4d 41 54 20 31 0a 23 64 65 66 69 6e 65 20 43 RMAT 1.#define C
01b0: 48 41 4e 5f 45 4f 46 20 30 78 31 30 0a 0a 2f 2a HAN_EOF 0x10../*
01c0: 0a 20 2a 20 54 68 69 73 20 73 74 72 75 63 74 75 . * This structu
01d0: 72 65 20 64 65 73 63 72 69 62 65 73 20 74 68 65 re describes the
01e0: 20 70 65 72 2d 69 6e 73 74 61 6e 63 65 20 73 74 per-instance st
01f0: 61 74 65 20 6f 66 20 61 6e 20 53 53 4c 20 63 68 ate of an SSL ch
0200: 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a 20 54 68 65 annel.. *. * The
0210: 20 53 53 4c 20 70 72 6f 63 65 73 73 69 6e 67 20 SSL processing
0220: 63 6f 6e 74 65 78 74 20 69 73 20 6d 61 69 6e 74 context is maint
0230: 61 69 6e 65 64 20 68 65 72 65 2c 20 69 6e 20 74 ained here, in t
0240: 68 65 20 43 6c 69 65 6e 74 44 61 74 61 0a 20 2a he ClientData. *
0250: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 /.typedef struct
0260: 20 44 69 67 65 73 74 53 74 61 74 65 20 7b 0a 09 DigestState {..
0270: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 73 65 6c 66 Tcl_Channel self
0280: 3b 09 2f 2a 20 54 68 69 73 20 73 6f 63 6b 65 74 ;./* This socket
0290: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 09 54 63 6c channel */..Tcl
02a0: 5f 54 69 6d 65 72 54 6f 6b 65 6e 20 74 69 6d 65 _TimerToken time
02b0: 72 3b 09 2f 2a 20 54 69 6d 65 72 20 66 6f 72 20 r;./* Timer for
02c0: 72 65 61 64 20 65 76 65 6e 74 73 20 2a 2f 0a 0a read events */..
02d0: 09 69 6e 74 20 66 6c 61 67 73 3b 09 09 2f 2a 20 .int flags;../*
02e0: 43 68 61 6e 20 63 6f 6e 66 69 67 20 66 6c 61 67 Chan config flag
02f0: 73 20 2a 2f 0a 09 69 6e 74 20 77 61 74 63 68 4d s */..int watchM
0300: 61 73 6b 3b 09 09 2f 2a 20 43 75 72 72 65 6e 74 ask;../* Current
0310: 20 57 61 74 63 68 50 72 6f 63 20 6d 61 73 6b 20 WatchProc mask
0320: 2a 2f 0a 09 69 6e 74 20 6d 6f 64 65 3b 09 09 2f */..int mode;../
0330: 2a 20 43 75 72 72 65 6e 74 20 6d 6f 64 65 20 6f * Current mode o
0340: 66 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c f parent channel
0350: 20 2a 2f 0a 09 69 6e 74 20 66 6f 72 6d 61 74 3b */..int format;
0360: 09 09 2f 2a 20 4f 75 74 70 75 74 20 66 6f 72 6d ../* Output form
0370: 61 74 20 2a 2f 0a 0a 09 54 63 6c 5f 49 6e 74 65 at */...Tcl_Inte
0380: 72 70 20 2a 69 6e 74 65 72 70 3b 09 2f 2a 20 43 rp *interp;./* C
0390: 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 urrent interpret
03a0: 65 72 20 2a 2f 0a 09 45 56 50 5f 4d 44 5f 43 54 er */..EVP_MD_CT
03b0: 58 20 2a 63 74 78 3b 09 2f 2a 20 4d 44 20 43 6f X *ctx;./* MD Co
03c0: 6e 74 65 78 74 20 2a 2f 0a 09 48 4d 41 43 5f 43 ntext */..HMAC_C
03d0: 54 58 20 2a 68 63 74 78 3b 09 09 2f 2a 20 48 4d TX *hctx;../* HM
03e0: 41 43 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 09 54 AC Context */..T
03f0: 63 6c 5f 43 6f 6d 6d 61 6e 64 20 74 6f 6b 65 6e cl_Command token
0400: 3b 09 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74 6f 6b ;./* Command tok
0410: 65 6e 20 2a 2f 0a 7d 20 44 69 67 65 73 74 53 74 en */.} DigestSt
0420: 61 74 65 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ate;../*. *-----
0430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
0470: 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73 74 4e *. * Tls_DigestN
0480: 65 77 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 ew --. *. *.This
0490: 20 66 75 6e 63 74 69 6f 6e 20 63 72 65 61 74 65 function create
04a0: 73 20 61 20 64 69 67 65 73 74 20 73 74 61 74 65 s a digest state
04b0: 20 73 74 72 75 63 74 75 72 65 0a 20 2a 0a 20 2a structure. *. *
04c0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 44 69 67 Returns:. *.Dig
04d0: 65 73 74 20 73 74 72 75 63 74 75 72 65 20 70 6f est structure po
04e0: 69 6e 74 65 72 0a 20 2a 0a 20 2a 20 53 69 64 65 inter. *. * Side
04f0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 43 72 65 effects:. *.Cre
0500: 61 74 65 73 20 73 74 72 75 63 74 75 72 65 0a 20 ates structure.
0510: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
0520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0550: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 44 69 67 65 -------. */.Dige
0560: 73 74 53 74 61 74 65 20 2a 54 6c 73 5f 44 69 67 stState *Tls_Dig
0570: 65 73 74 4e 65 77 28 54 63 6c 5f 49 6e 74 65 72 estNew(Tcl_Inter
0580: 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 66 p *interp, int f
0590: 6f 72 6d 61 74 29 20 7b 0a 20 20 20 20 44 69 67 ormat) {. Dig
05a0: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 estState *stateP
05b0: 74 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 tr = NULL;..
05c0: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 statePtr = (Dige
05d0: 73 74 53 74 61 74 65 20 2a 29 20 63 6b 61 6c 6c stState *) ckall
05e0: 6f 63 28 28 75 6e 73 69 67 6e 65 64 29 20 73 69 oc((unsigned) si
05f0: 7a 65 6f 66 28 44 69 67 65 73 74 53 74 61 74 65 zeof(DigestState
0600: 29 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 74 ));. if (stat
0610: 65 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a ePtr != NULL) {.
0620: 09 6d 65 6d 73 65 74 28 73 74 61 74 65 50 74 72 .memset(statePtr
0630: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 44 69 67 65 , 0, sizeof(Dige
0640: 73 74 53 74 61 74 65 29 29 3b 0a 09 73 74 61 74 stState));..stat
0650: 65 50 74 72 2d 3e 73 65 6c 66 09 3d 20 4e 55 4c ePtr->self.= NUL
0660: 4c 3b 09 09 2f 2a 20 54 68 69 73 20 73 6f 63 6b L;../* This sock
0670: 65 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 09 73 et channel */..s
0680: 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d tatePtr->timer =
0690: 20 4e 55 4c 4c 3b 09 09 2f 2a 20 54 69 6d 65 72 NULL;../* Timer
06a0: 20 74 6f 20 66 6c 75 73 68 20 64 61 74 61 20 2a to flush data *
06b0: 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6c 61 /..statePtr->fla
06c0: 67 73 20 3d 20 30 3b 09 09 2f 2a 20 43 68 61 6e gs = 0;../* Chan
06d0: 20 63 6f 6e 66 69 67 20 66 6c 61 67 73 20 2a 2f config flags */
06e0: 0a 09 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63 ..statePtr->watc
06f0: 68 4d 61 73 6b 20 3d 20 30 3b 09 2f 2a 20 43 75 hMask = 0;./* Cu
0700: 72 72 65 6e 74 20 57 61 74 63 68 50 72 6f 63 20 rrent WatchProc
0710: 6d 61 73 6b 20 2a 2f 0a 09 73 74 61 74 65 50 74 mask */..statePt
0720: 72 2d 3e 6d 6f 64 65 09 3d 20 30 3b 09 09 2f 2a r->mode.= 0;../*
0730: 20 43 75 72 72 65 6e 74 20 6d 6f 64 65 20 6f 66 Current mode of
0740: 20 70 61 72 65 6e 74 20 63 68 61 6e 6e 65 6c 20 parent channel
0750: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 66 6f */..statePtr->fo
0760: 72 6d 61 74 20 3d 20 66 6f 72 6d 61 74 3b 09 2f rmat = format;./
0770: 2a 20 4f 75 74 70 75 74 20 66 6f 72 6d 61 74 20 * Output format
0780: 2a 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 69 6e */..statePtr->in
0790: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 09 2f terp = interp;./
07a0: 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70 * Current interp
07b0: 72 65 74 65 72 20 2a 2f 0a 09 73 74 61 74 65 50 reter */..stateP
07c0: 74 72 2d 3e 63 74 78 20 3d 20 4e 55 4c 4c 3b 09 tr->ctx = NULL;.
07d0: 09 2f 2a 20 4d 44 20 43 6f 6e 74 65 78 74 20 2a ./* MD Context *
07e0: 2f 0a 09 73 74 61 74 65 50 74 72 2d 3e 68 63 74 /..statePtr->hct
07f0: 78 20 3d 20 4e 55 4c 4c 3b 09 09 2f 2a 20 48 4d x = NULL;../* HM
0800: 41 43 20 43 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 AC Context */.
0810: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 73 }. return s
0820: 74 61 74 65 50 74 72 3b 0a 7d 0a 0a 2f 2a 0a 20 tatePtr;.}../*.
0830: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
0840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0870: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44 ----. *. * Tls_D
0880: 69 67 65 73 74 46 72 65 65 20 2d 2d 0a 20 2a 0a igestFree --. *.
0890: 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e *.This function
08a0: 20 72 65 6d 6f 76 65 73 20 61 20 64 69 67 65 73 removes a diges
08b0: 74 20 73 74 61 74 65 20 73 74 72 75 63 74 75 72 t state structur
08c0: 65 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a e. *. * Returns:
08d0: 0a 20 2a 09 4e 6f 74 68 69 6e 67 0a 20 2a 0a 20 . *.Nothing. *.
08e0: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
08f0: 20 2a 09 52 65 6d 6f 76 65 73 20 73 74 72 75 63 *.Removes struc
0900: 74 75 72 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d ture. *. *------
0910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0920: 2d 2d 2d 2d 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 0a 20 2a -------------. *
0950: 2f 0a 76 6f 69 64 20 54 6c 73 5f 44 69 67 65 73 /.void Tls_Diges
0960: 74 46 72 65 65 28 44 69 67 65 73 74 53 74 61 74 tFree(DigestStat
0970: 65 20 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 e *statePtr) {.
0980: 20 20 20 69 66 20 28 73 74 61 74 65 50 74 72 20 if (statePtr
0990: 3d 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 == (DigestState
09a0: 2a 29 20 4e 55 4c 4c 29 20 72 65 74 75 72 6e 3b *) NULL) return;
09b0: 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 .. if (stateP
09c0: 74 72 2d 3e 63 74 78 20 21 3d 20 28 45 56 50 5f tr->ctx != (EVP_
09d0: 4d 44 5f 43 54 58 20 2a 29 20 4e 55 4c 4c 29 20 MD_CTX *) NULL)
09e0: 7b 0a 09 45 56 50 5f 4d 44 5f 43 54 58 5f 66 72 {..EVP_MD_CTX_fr
09f0: 65 65 28 73 74 61 74 65 50 74 72 2d 3e 63 74 78 ee(statePtr->ctx
0a00: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 );. }. if
0a10: 28 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 20 (statePtr->hctx
0a20: 21 3d 20 28 48 4d 41 43 5f 43 54 58 20 2a 29 20 != (HMAC_CTX *)
0a30: 4e 55 4c 4c 29 20 7b 0a 09 48 4d 41 43 5f 43 54 NULL) {..HMAC_CT
0a40: 58 5f 66 72 65 65 28 73 74 61 74 65 50 74 72 2d X_free(statePtr-
0a50: 3e 68 63 74 78 29 3b 0a 20 20 20 20 7d 0a 20 20 >hctx);. }.
0a60: 20 20 63 6b 66 72 65 65 28 73 74 61 74 65 50 74 ckfree(statePt
0a70: 72 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a r);.}../********
0a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0a90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0aa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0ab0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a ***********/../*
0ac0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
0ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0b00: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 ------. *. * Tls
0b10: 5f 44 69 67 65 73 74 49 6e 69 74 20 2d 2d 0a 20 _DigestInit --.
0b20: 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 20 *. *.Initialize
0b30: 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 0a a hash function.
0b40: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 *. * Returns:.
0b50: 2a 09 54 43 4c 5f 4f 4b 20 69 66 20 73 75 63 63 *.TCL_OK if succ
0b60: 65 73 73 66 75 6c 20 6f 72 20 54 43 4c 5f 45 52 essful or TCL_ER
0b70: 52 4f 52 20 66 6f 72 20 66 61 69 6c 75 72 65 20 ROR for failure
0b80: 77 69 74 68 20 72 65 73 75 6c 74 20 73 65 74 0a with result set.
0b90: 20 2a 09 74 6f 20 65 72 72 6f 72 20 6d 65 73 73 *.to error mess
0ba0: 61 67 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 age.. *. * Side
0bb0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 20 72 effects:. *.No r
0bc0: 65 73 75 6c 74 20 6f 72 20 65 72 72 6f 72 20 6d esult or error m
0bd0: 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d essage. *. *----
0be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
0c20: 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f 44 69 67 65 */.int Tls_Dige
0c30: 73 74 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 stInit(Tcl_Inter
0c40: 70 20 2a 69 6e 74 65 72 70 2c 20 44 69 67 65 73 p *interp, Diges
0c50: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 tState *statePtr
0c60: 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a , const EVP_MD *
0c70: 6d 64 2c 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6b 65 md,..Tcl_Obj *ke
0c80: 79 4f 62 6a 29 20 7b 0a 20 20 20 20 69 6e 74 20 yObj) {. int
0c90: 6b 65 79 5f 6c 65 6e 2c 20 72 65 73 3b 0a 20 20 key_len, res;.
0ca0: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 const unsigned
0cb0: 20 63 68 61 72 20 2a 6b 65 79 3b 0a 0a 20 20 20 char *key;..
0cc0: 20 2f 2a 20 43 72 65 61 74 65 20 6d 65 73 73 61 /* Create messa
0cd0: 67 65 20 64 69 67 65 73 74 20 63 6f 6e 74 65 78 ge digest contex
0ce0: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 6b 65 79 t */. if (key
0cf0: 4f 62 6a 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 Obj == NULL) {..
0d00: 73 74 61 74 65 50 74 72 2d 3e 63 74 78 20 3d 20 statePtr->ctx =
0d10: 45 56 50 5f 4d 44 5f 43 54 58 5f 6e 65 77 28 29 EVP_MD_CTX_new()
0d20: 3b 0a 09 72 65 73 20 3d 20 28 73 74 61 74 65 50 ;..res = (stateP
0d30: 74 72 2d 3e 63 74 78 20 21 3d 20 4e 55 4c 4c 29 tr->ctx != NULL)
0d40: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
0d50: 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 20 3d statePtr->hctx =
0d60: 20 48 4d 41 43 5f 43 54 58 5f 6e 65 77 28 29 3b HMAC_CTX_new();
0d70: 0a 09 72 65 73 20 3d 20 28 73 74 61 74 65 50 74 ..res = (statePt
0d80: 72 2d 3e 68 63 74 78 20 21 3d 20 4e 55 4c 4c 29 r->hctx != NULL)
0d90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 ;. }. if (
0da0: 21 72 65 73 29 20 7b 0a 09 54 63 6c 5f 41 70 70 !res) {..Tcl_App
0db0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
0dc0: 2c 20 22 43 72 65 61 74 65 20 64 69 67 65 73 74 , "Create digest
0dd0: 20 63 6f 6e 74 65 78 74 20 66 61 69 6c 65 64 3a context failed:
0de0: 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 ", REASON(), NU
0df0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
0e00: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
0e10: 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 /* Initialize
0e20: 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a hash function *
0e30: 2f 0a 20 20 20 20 69 66 20 28 6b 65 79 4f 62 6a /. if (keyObj
0e40: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 == NULL) {..res
0e50: 20 3d 20 45 56 50 5f 44 69 67 65 73 74 49 6e 69 = EVP_DigestIni
0e60: 74 5f 65 78 28 73 74 61 74 65 50 74 72 2d 3e 63 t_ex(statePtr->c
0e70: 74 78 2c 20 6d 64 2c 20 4e 55 4c 4c 29 3b 0a 20 tx, md, NULL);.
0e80: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6b 65 79 } else {..key
0e90: 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 = Tcl_GetByteAr
0ea0: 72 61 79 46 72 6f 6d 4f 62 6a 28 6b 65 79 4f 62 rayFromObj(keyOb
0eb0: 6a 2c 20 26 6b 65 79 5f 6c 65 6e 29 3b 0a 09 72 j, &key_len);..r
0ec0: 65 73 20 3d 20 48 4d 41 43 5f 49 6e 69 74 5f 65 es = HMAC_Init_e
0ed0: 78 28 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 x(statePtr->hctx
0ee0: 2c 20 28 63 6f 6e 73 74 20 76 6f 69 64 20 2a 29 , (const void *)
0ef0: 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 2c 20 6d key, key_len, m
0f00: 64 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 0a d, NULL);. }.
0f10: 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 0a if (!res) {.
0f20: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
0f30: 74 28 69 6e 74 65 72 70 2c 20 22 49 6e 69 74 69 t(interp, "Initi
0f40: 61 6c 69 7a 65 20 64 69 67 65 73 74 20 66 61 69 alize digest fai
0f50: 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 led: ", REASON()
0f60: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e , NULL);..return
0f70: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
0f80: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c }. return TCL
0f90: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d _OK;.}../*. *---
0fa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fe0: 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73 . *. * Tls_Diges
0ff0: 74 55 70 64 61 74 65 20 2d 2d 0a 20 2a 0a 20 2a tUpdate --. *. *
1000: 09 55 70 64 61 74 65 20 61 20 68 61 73 68 20 66 .Update a hash f
1010: 75 6e 63 74 69 6f 6e 0a 20 2a 0a 20 2a 20 52 65 unction. *. * Re
1020: 74 75 72 6e 73 3a 0a 20 2a 09 31 20 69 66 20 73 turns:. *.1 if s
1030: 75 63 63 65 73 73 66 75 6c 20 6f 72 20 30 20 66 uccessful or 0 f
1040: 6f 72 20 66 61 69 6c 75 72 65 0a 20 2a 0a 20 2a or failure. *. *
1050: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
1060: 2a 09 41 64 64 73 20 62 75 66 20 74 6f 20 68 61 *.Adds buf to ha
1070: 73 68 20 66 75 6e 63 74 69 6f 6e 0a 20 2a 0a 20 sh function. *.
1080: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
1090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10c0: 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73 ----. */.int Tls
10d0: 5f 44 69 67 65 73 74 55 70 64 61 74 65 28 44 69 _DigestUpdate(Di
10e0: 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 gestState *state
10f0: 50 74 72 2c 20 63 68 61 72 20 2a 62 75 66 2c 20 Ptr, char *buf,
1100: 73 69 7a 65 5f 74 20 72 65 61 64 29 20 7b 0a 20 size_t read) {.
1110: 20 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 20 int res;..
1120: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 if (statePtr->c
1130: 74 78 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 tx != NULL) {..r
1140: 65 73 20 3d 20 45 56 50 5f 44 69 67 65 73 74 55 es = EVP_DigestU
1150: 70 64 61 74 65 28 73 74 61 74 65 50 74 72 2d 3e pdate(statePtr->
1160: 63 74 78 2c 20 62 75 66 2c 20 72 65 61 64 29 3b ctx, buf, read);
1170: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 . } else {..r
1180: 65 73 20 3d 20 48 4d 41 43 5f 55 70 64 61 74 65 es = HMAC_Update
1190: 28 73 74 61 74 65 50 74 72 2d 3e 68 63 74 78 2c (statePtr->hctx,
11a0: 20 62 75 66 2c 20 72 65 61 64 29 3b 0a 20 20 20 buf, read);.
11b0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 }. return re
11c0: 73 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d s;.}../*. *-----
11d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
1210: 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73 74 46 *. * Tls_DigestF
1220: 69 6e 69 61 6c 69 7a 65 20 2d 2d 0a 20 2a 0a 20 inialize --. *.
1230: 2a 09 46 69 6e 61 6c 69 7a 65 20 61 20 68 61 73 *.Finalize a has
1240: 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 67 h function and g
1250: 65 6e 65 72 61 74 65 20 61 20 6d 65 73 73 61 67 enerate a messag
1260: 65 20 64 69 67 65 73 74 0a 20 2a 0a 20 2a 20 52 e digest. *. * R
1270: 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f eturns:. *.TCL_O
1280: 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 K if successful
1290: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 66 6f 72 or TCL_ERROR for
12a0: 20 66 61 69 6c 75 72 65 20 77 69 74 68 20 72 65 failure with re
12b0: 73 75 6c 74 20 73 65 74 0a 20 2a 09 74 6f 20 65 sult set. *.to e
12c0: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a rror message.. *
12d0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
12e0: 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74 :. *.Sets result
12f0: 20 74 6f 20 6d 65 73 73 61 67 65 20 64 69 67 65 to message dige
1300: 73 74 20 66 6f 72 20 68 61 73 68 20 66 75 6e 63 st for hash func
1310: 74 69 6f 6e 20 6f 72 20 61 6e 20 65 72 72 6f 72 tion or an error
1320: 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 2d message.. *. *-
1330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1370: 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 20 54 6c 73 5f --. */..int Tls_
1380: 44 69 67 65 73 74 46 69 6e 69 61 6c 69 7a 65 28 DigestFinialize(
1390: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
13a0: 72 70 2c 20 44 69 67 65 73 74 53 74 61 74 65 20 rp, DigestState
13b0: 2a 73 74 61 74 65 50 74 72 29 20 7b 0a 20 20 20 *statePtr) {.
13c0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d unsigned char m
13d0: 64 5f 62 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 d_buf[EVP_MAX_MD
13e0: 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 75 6e 73 69 _SIZE];. unsi
13f0: 67 6e 65 64 20 69 6e 74 20 6d 64 5f 6c 65 6e 3b gned int md_len;
1400: 0a 20 20 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 . int res;..
1410: 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 68 /* Finalize h
1420: 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 ash function and
1430: 20 63 61 6c 63 75 6c 61 74 65 20 6d 65 73 73 61 calculate messa
1440: 67 65 20 64 69 67 65 73 74 20 2a 2f 0a 20 20 20 ge digest */.
1450: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 63 if (statePtr->c
1460: 74 78 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 tx != NULL) {..r
1470: 65 73 20 3d 20 45 56 50 5f 44 69 67 65 73 74 46 es = EVP_DigestF
1480: 69 6e 61 6c 5f 65 78 28 73 74 61 74 65 50 74 72 inal_ex(statePtr
1490: 2d 3e 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26 ->ctx, md_buf, &
14a0: 6d 64 5f 6c 65 6e 29 3b 0a 20 20 20 20 7d 20 65 md_len);. } e
14b0: 6c 73 65 20 7b 0a 09 72 65 73 20 3d 20 48 4d 41 lse {..res = HMA
14c0: 43 5f 46 69 6e 61 6c 28 73 74 61 74 65 50 74 72 C_Final(statePtr
14d0: 2d 3e 68 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20 ->hctx, md_buf,
14e0: 26 6d 64 5f 6c 65 6e 29 3b 0a 20 20 20 20 7d 0a &md_len);. }.
14f0: 20 20 20 20 69 66 20 28 21 72 65 73 29 20 7b 0a if (!res) {.
1500: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
1510: 74 28 69 6e 74 65 72 70 2c 20 22 46 69 6e 61 6c t(interp, "Final
1520: 69 7a 65 20 64 69 67 65 73 74 20 66 61 69 6c 65 ize digest faile
1530: 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 d: ", REASON(),
1540: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
1550: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
1560: 0a 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 6d . /* Return m
1570: 65 73 73 61 67 65 20 64 69 67 65 73 74 20 61 73 essage digest as
1580: 20 65 69 74 68 65 72 20 61 20 62 69 6e 61 72 79 either a binary
1590: 20 6f 72 20 68 65 78 20 73 74 72 69 6e 67 20 2a or hex string *
15a0: 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 50 /. if (stateP
15b0: 74 72 2d 3e 66 6f 72 6d 61 74 20 3d 3d 20 42 49 tr->format == BI
15c0: 4e 5f 46 4f 52 4d 41 54 29 20 7b 0a 09 54 63 6c N_FORMAT) {..Tcl
15d0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
15e0: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 terp, Tcl_NewByt
15f0: 65 41 72 72 61 79 4f 62 6a 28 6d 64 5f 62 75 66 eArrayObj(md_buf
1600: 2c 20 6d 64 5f 6c 65 6e 29 29 3b 0a 0a 20 20 20 , md_len));..
1610: 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f } else {..Tcl_O
1620: 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d 20 bj *resultObj =
1630: 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 09 75 Tcl_NewObj();..u
1640: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 74 nsigned char *pt
1650: 72 20 3d 20 54 63 6c 5f 53 65 74 42 79 74 65 41 r = Tcl_SetByteA
1660: 72 72 61 79 4c 65 6e 67 74 68 28 72 65 73 75 6c rrayLength(resul
1670: 74 4f 62 6a 2c 20 6d 64 5f 6c 65 6e 2a 32 29 3b tObj, md_len*2);
1680: 0a 0a 09 66 6f 72 20 28 75 6e 73 69 67 6e 65 64 ...for (unsigned
1690: 20 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 int i = 0; i <
16a0: 6d 64 5f 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 md_len; i++) {..
16b0: 20 20 20 20 2a 70 74 72 2b 2b 20 3d 20 68 65 78 *ptr++ = hex
16c0: 5b 28 6d 64 5f 62 75 66 5b 69 5d 20 3e 3e 20 34 [(md_buf[i] >> 4
16d0: 29 20 26 20 30 78 30 46 5d 3b 0a 09 20 20 20 20 ) & 0x0F];..
16e0: 2a 70 74 72 2b 2b 20 3d 20 68 65 78 5b 6d 64 5f *ptr++ = hex[md_
16f0: 62 75 66 5b 69 5d 20 26 20 30 78 30 46 5d 3b 0a buf[i] & 0x0F];.
1700: 09 7d 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 .}..Tcl_SetObjRe
1710: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 73 sult(interp, res
1720: 75 6c 74 4f 62 6a 29 3b 0a 20 20 20 20 7d 0a 20 ultObj);. }.
1730: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
1740: 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ;.}../**********
1750: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1760: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1770: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1780: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 0a 2f 2a 0a *********/.../*.
1790: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
17a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17d0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f -----. *. * Tls_
17e0: 44 69 67 65 73 74 46 69 6c 65 20 2d 2d 0a 20 2a DigestFile --. *
17f0: 0a 20 2a 09 52 65 74 75 72 6e 20 6d 65 73 73 61 . *.Return messa
1800: 67 65 20 64 69 67 65 73 74 20 66 6f 72 20 66 69 ge digest for fi
1810: 6c 65 20 75 73 69 6e 67 20 75 73 65 72 20 73 70 le using user sp
1820: 65 63 69 66 69 65 64 20 68 61 73 68 20 66 75 6e ecified hash fun
1830: 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 ction.. *. * Ret
1840: 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 urns:. *.TCL_OK
1850: 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a or TCL_ERROR. *.
1860: 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a * Side effects:
1870: 0a 20 2a 09 52 65 73 75 6c 74 20 69 73 20 6d 65 . *.Result is me
1880: 73 73 61 67 65 20 64 69 67 65 73 74 20 6f 72 20 ssage digest or
1890: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a error message. *
18a0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
18b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
18c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
18d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
18e0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 54 ------. */.int T
18f0: 6c 73 5f 44 69 67 65 73 74 46 69 6c 65 28 54 63 ls_DigestFile(Tc
1900: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
1910: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 66 69 6c 65 6e , Tcl_Obj *filen
1920: 61 6d 65 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d ame, const EVP_M
1930: 44 20 2a 6d 64 2c 20 69 6e 74 20 66 6f 72 6d 61 D *md, int forma
1940: 74 2c 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 t,..Tcl_Obj *key
1950: 4f 62 6a 29 20 7b 0a 20 20 20 20 44 69 67 65 73 Obj) {. Diges
1960: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 tState *statePtr
1970: 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 ;. Tcl_Channe
1980: 6c 20 63 68 61 6e 20 3d 20 4e 55 4c 4c 3b 0a 20 l chan = NULL;.
1990: 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 unsigned char
19a0: 20 62 75 66 5b 42 55 46 46 45 52 5f 53 49 5a 45 buf[BUFFER_SIZE
19b0: 5d 3b 0a 20 20 20 20 69 6e 74 20 72 65 73 20 3d ];. int res =
19c0: 20 54 43 4c 5f 4f 4b 2c 20 6c 65 6e 3b 0a 0a 20 TCL_OK, len;..
19d0: 20 20 20 2f 2a 20 4f 70 65 6e 20 66 69 6c 65 20 /* Open file
19e0: 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 channel */. c
19f0: 68 61 6e 20 3d 20 54 63 6c 5f 46 53 4f 70 65 6e han = Tcl_FSOpen
1a00: 46 69 6c 65 43 68 61 6e 6e 65 6c 28 69 6e 74 65 FileChannel(inte
1a10: 72 70 2c 20 66 69 6c 65 6e 61 6d 65 2c 20 22 72 rp, filename, "r
1a20: 62 22 2c 20 30 34 34 34 29 3b 0a 20 20 20 20 69 b", 0444);. i
1a30: 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c 5f f (chan == (Tcl_
1a40: 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b Channel) NULL) {
1a50: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
1a60: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
1a70: 2a 20 43 6f 6e 66 69 67 75 72 65 20 63 68 61 6e * Configure chan
1a80: 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 nel */. if (T
1a90: 63 6c 5f 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 cl_SetChannelOpt
1aa0: 69 6f 6e 28 69 6e 74 65 72 70 2c 20 63 68 61 6e ion(interp, chan
1ab0: 2c 20 22 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 , "-translation"
1ac0: 2c 20 22 62 69 6e 61 72 79 22 29 20 3d 3d 20 54 , "binary") == T
1ad0: 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 73 CL_ERROR) {..res
1ae0: 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 67 = TCL_ERROR;..g
1af0: 6f 74 6f 20 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a oto done;. }.
1b00: 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e 6e Tcl_SetChann
1b10: 65 6c 42 75 66 66 65 72 53 69 7a 65 28 63 68 61 elBufferSize(cha
1b20: 6e 2c 20 42 55 46 46 45 52 5f 53 49 5a 45 29 3b n, BUFFER_SIZE);
1b30: 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 .. /* Create
1b40: 73 74 72 75 63 74 20 2a 2f 0a 20 20 20 20 69 66 struct */. if
1b50: 20 28 28 73 74 61 74 65 50 74 72 20 3d 20 54 6c ((statePtr = Tl
1b60: 73 5f 44 69 67 65 73 74 4e 65 77 28 69 6e 74 65 s_DigestNew(inte
1b70: 72 70 2c 20 66 6f 72 6d 61 74 29 29 20 3d 3d 20 rp, format)) ==
1b80: 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d 20 54 NULL) {..res = T
1b90: 43 4c 5f 45 52 52 4f 52 3b 0a 09 67 6f 74 6f 20 CL_ERROR;..goto
1ba0: 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 done;. }..
1bb0: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 68 /* Initialize h
1bc0: 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a ash function */.
1bd0: 20 20 20 20 69 66 20 28 28 72 65 73 20 3d 20 54 if ((res = T
1be0: 6c 73 5f 44 69 67 65 73 74 49 6e 69 74 28 69 6e ls_DigestInit(in
1bf0: 74 65 72 70 2c 20 73 74 61 74 65 50 74 72 2c 20 terp, statePtr,
1c00: 6d 64 2c 20 6b 65 79 4f 62 6a 29 29 20 21 3d 20 md, keyObj)) !=
1c10: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 67 6f 74 6f 20 TCL_OK) {..goto
1c20: 64 6f 6e 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 done;. }..
1c30: 20 2f 2a 20 52 65 61 64 20 66 69 6c 65 20 64 61 /* Read file da
1c40: 74 61 20 61 6e 64 20 75 70 64 61 74 65 20 68 61 ta and update ha
1c50: 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 sh function */.
1c60: 20 20 20 77 68 69 6c 65 20 28 21 54 63 6c 5f 45 while (!Tcl_E
1c70: 6f 66 28 63 68 61 6e 29 29 20 7b 0a 09 6c 65 6e of(chan)) {..len
1c80: 20 3d 20 54 63 6c 5f 52 65 61 64 52 61 77 28 63 = Tcl_ReadRaw(c
1c90: 68 61 6e 2c 20 28 63 68 61 72 20 2a 29 20 62 75 han, (char *) bu
1ca0: 66 2c 20 42 55 46 46 45 52 5f 53 49 5a 45 29 3b f, BUFFER_SIZE);
1cb0: 0a 09 69 66 20 28 6c 65 6e 20 3e 20 30 29 20 7b ..if (len > 0) {
1cc0: 0a 09 20 20 20 20 69 66 20 28 21 54 6c 73 5f 44 .. if (!Tls_D
1cd0: 69 67 65 73 74 55 70 64 61 74 65 28 73 74 61 74 igestUpdate(stat
1ce0: 65 50 74 72 2c 20 26 62 75 66 5b 30 5d 2c 20 28 ePtr, &buf[0], (
1cf0: 73 69 7a 65 5f 74 29 20 6c 65 6e 29 29 20 7b 0a size_t) len)) {.
1d00: 09 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 ..Tcl_AppendResu
1d10: 6c 74 28 69 6e 74 65 72 70 2c 20 22 55 70 64 61 lt(interp, "Upda
1d20: 74 65 20 64 69 67 65 73 74 20 66 61 69 6c 65 64 te digest failed
1d30: 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e : ", REASON(), N
1d40: 55 4c 4c 29 3b 0a 09 09 72 65 73 20 3d 20 54 43 ULL);...res = TC
1d50: 4c 5f 45 52 52 4f 52 3b 0a 09 09 67 6f 74 6f 20 L_ERROR;...goto
1d60: 64 6f 6e 65 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a done;.. }..}.
1d70: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 69 }.. /* Fi
1d80: 6e 61 6c 69 7a 65 20 68 61 73 68 20 66 75 6e 63 nalize hash func
1d90: 74 69 6f 6e 20 61 6e 64 20 63 61 6c 63 75 6c 61 tion and calcula
1da0: 74 65 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 te message diges
1db0: 74 20 2a 2f 0a 20 20 20 20 72 65 73 20 3d 20 54 t */. res = T
1dc0: 6c 73 5f 44 69 67 65 73 74 46 69 6e 69 61 6c 69 ls_DigestFiniali
1dd0: 7a 65 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 ze(interp, state
1de0: 50 74 72 29 3b 0a 0a 64 6f 6e 65 3a 0a 20 20 20 Ptr);..done:.
1df0: 20 2f 2a 20 43 6c 6f 73 65 20 63 68 61 6e 6e 65 /* Close channe
1e00: 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c l */. if (Tcl
1e10: 5f 43 6c 6f 73 65 28 69 6e 74 65 72 70 2c 20 63 _Close(interp, c
1e20: 68 61 6e 29 20 3d 3d 20 54 43 4c 5f 45 52 52 4f han) == TCL_ERRO
1e30: 52 29 20 7b 0a 09 63 68 61 6e 20 3d 20 28 54 63 R) {..chan = (Tc
1e40: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 3b l_Channel) NULL;
1e50: 0a 09 72 65 73 20 3d 20 54 43 4c 5f 45 52 52 4f ..res = TCL_ERRO
1e60: 52 3b 0a 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a 20 R;..goto done;.
1e70: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 }.. /* Cle
1e80: 61 6e 2d 75 70 20 2a 2f 0a 20 20 20 20 54 6c 73 an-up */. Tls
1e90: 5f 44 69 67 65 73 74 46 72 65 65 28 73 74 61 74 _DigestFree(stat
1ea0: 65 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 ePtr);. retur
1eb0: 6e 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a n res;.}../*****
1ec0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1ed0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1ee0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1ef0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a **************/.
1f00: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
1f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
1f50: 44 69 67 65 73 74 42 6c 6f 63 6b 4d 6f 64 65 50 DigestBlockModeP
1f60: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 roc --. *. *.Thi
1f70: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e s function is in
1f80: 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67 65 6e voked by the gen
1f90: 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 0a 20 2a eric IO level. *
1fa0: 20 20 20 20 20 20 20 74 6f 20 73 65 74 20 62 6c to set bl
1fb0: 6f 63 6b 69 6e 67 20 61 6e 64 20 6e 6f 6e 62 6c ocking and nonbl
1fc0: 6f 63 6b 69 6e 67 20 6d 6f 64 65 73 2e 0a 20 2a ocking modes.. *
1fd0: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 . * Returns:. *.
1fe0: 30 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 20 0 if successful
1ff0: 6f 72 20 50 4f 53 49 58 20 65 72 72 6f 72 20 63 or POSIX error c
2000: 6f 64 65 20 69 66 20 66 61 69 6c 65 64 2e 0a 20 ode if failed..
2010: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
2020: 73 3a 0a 20 2a 09 53 65 74 73 20 74 68 65 20 64 s:. *.Sets the d
2030: 65 76 69 63 65 20 69 6e 74 6f 20 62 6c 6f 63 6b evice into block
2040: 69 6e 67 20 6f 72 20 6e 6f 6e 62 6c 6f 63 6b 69 ing or nonblocki
2050: 6e 67 20 6d 6f 64 65 2e 0a 20 2a 09 43 61 6e 20 ng mode.. *.Can
2060: 63 61 6c 6c 20 54 63 6c 5f 53 65 74 43 68 61 6e call Tcl_SetChan
2070: 6e 65 6c 45 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d nelError.. *. *-
2080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
20c0: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e --. */.static in
20d0: 74 20 44 69 67 65 73 74 42 6c 6f 63 6b 4d 6f 64 t DigestBlockMod
20e0: 65 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 eProc(ClientData
20f0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 clientData, int
2100: 20 6d 6f 64 65 29 20 7b 0a 20 20 20 20 44 69 67 mode) {. Dig
2110: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 estState *stateP
2120: 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 tr = (DigestStat
2130: 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b e *) clientData;
2140: 0a 0a 20 20 20 20 69 66 20 28 6d 6f 64 65 20 3d .. if (mode =
2150: 3d 20 54 43 4c 5f 4d 4f 44 45 5f 4e 4f 4e 42 4c = TCL_MODE_NONBL
2160: 4f 43 4b 49 4e 47 29 20 7b 0a 09 73 74 61 74 65 OCKING) {..state
2170: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 4c Ptr->flags |= TL
2180: 53 5f 54 43 4c 5f 41 53 59 4e 43 3b 0a 20 20 20 S_TCL_ASYNC;.
2190: 20 7d 20 65 6c 73 65 20 7b 0a 09 73 74 61 74 65 } else {..state
21a0: 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 Ptr->flags &= ~(
21b0: 54 4c 53 5f 54 43 4c 5f 41 53 59 4e 43 29 3b 0a TLS_TCL_ASYNC);.
21c0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
21d0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 0;.}../*. *----
21e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
21f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
2220: 20 2a 0a 20 2a 20 44 69 67 65 73 74 43 6c 6f 73 *. * DigestClos
2230: 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 eProc --. *. *.T
2240: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 his function is
2250: 69 6e 76 6f 6b 65 64 20 62 79 20 74 68 65 20 67 invoked by the g
2260: 65 6e 65 72 69 63 20 49 4f 20 6c 65 76 65 6c 20 eneric IO level
2270: 74 6f 20 70 65 72 66 6f 72 6d 0a 20 2a 09 63 68 to perform. *.ch
2280: 61 6e 6e 65 6c 2d 74 79 70 65 2d 73 70 65 63 69 annel-type-speci
2290: 66 69 63 20 63 6c 65 61 6e 75 70 20 77 68 65 6e fic cleanup when
22a0: 20 63 68 61 6e 6e 65 6c 20 69 73 20 63 6c 6f 73 channel is clos
22b0: 65 64 2e 20 41 6c 6c 0a 20 2a 09 71 75 65 75 65 ed. All. *.queue
22c0: 64 20 6f 75 74 70 75 74 20 69 73 20 66 6c 75 73 d output is flus
22d0: 68 65 64 20 70 72 69 6f 72 20 74 6f 20 63 61 6c hed prior to cal
22e0: 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 ling this functi
22f0: 6f 6e 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e on.. *. * Return
2300: 73 3a 0a 20 2a 09 30 20 69 66 20 73 75 63 63 65 s:. *.0 if succe
2310: 73 73 66 75 6c 20 6f 72 20 50 4f 53 49 58 20 65 ssful or POSIX e
2320: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 66 61 69 rror code if fai
2330: 6c 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 led.. *. * Side
2340: 65 66 66 65 63 74 73 3a 0a 20 2a 09 57 72 69 74 effects:. *.Writ
2350: 65 73 20 64 69 67 65 73 74 20 74 6f 20 6f 75 74 es digest to out
2360: 70 75 74 20 61 6e 64 20 63 6c 6f 73 65 73 20 74 put and closes t
2370: 68 65 20 63 68 61 6e 6e 65 6c 2e 20 53 74 6f 72 he channel. Stor
2380: 65 73 20 65 72 72 6f 72 0a 20 2a 09 6d 65 73 73 es error. *.mess
2390: 61 67 65 73 20 69 6e 20 69 6e 74 65 72 70 20 72 ages in interp r
23a0: 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d esult.. *. *----
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: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
23f0: 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 43 6c */.int DigestCl
2400: 6f 73 65 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 oseProc(ClientDa
2410: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
2420: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
2430: 70 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 p) {. DigestS
2440: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
2450: 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 (DigestState *)
2460: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 clientData;..
2470: 20 20 2f 2a 20 43 61 6e 63 65 6c 20 61 63 74 69 /* Cancel acti
2480: 76 65 20 74 69 6d 65 72 2c 20 69 66 20 61 6e 79 ve timer, if any
2490: 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 74 */. if (stat
24a0: 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 28 ePtr->timer != (
24b0: 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 Tcl_TimerToken)
24c0: 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 6c NULL) {..Tcl_Del
24d0: 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 eteTimerHandler(
24e0: 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 29 statePtr->timer)
24f0: 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 6d ;..statePtr->tim
2500: 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 54 er = (Tcl_TimerT
2510: 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 20 oken) NULL;.
2520: 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d }.. /* Clean-
2530: 75 70 20 2a 2f 0a 20 20 20 20 54 6c 73 5f 44 69 up */. Tls_Di
2540: 67 65 73 74 46 72 65 65 28 73 74 61 74 65 50 74 gestFree(statePt
2550: 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 r);. return 0
2560: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 20 53 61 6d 65 20 ;.}../*. * Same
2570: 61 73 20 44 69 67 65 73 74 43 6c 6f 73 65 50 72 as DigestClosePr
2580: 6f 63 20 62 75 74 20 77 69 74 68 20 69 6e 64 69 oc but with indi
2590: 76 69 64 75 61 6c 20 72 65 61 64 20 61 6e 64 20 vidual read and
25a0: 77 72 69 74 65 20 63 6c 6f 73 65 20 63 6f 6e 74 write close cont
25b0: 72 6f 6c 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 rol. */.static i
25c0: 6e 74 20 44 69 67 65 73 74 43 6c 6f 73 65 32 50 nt DigestClose2P
25d0: 72 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 69 roc(ClientData i
25e0: 6e 73 74 61 6e 63 65 44 61 74 61 2c 20 54 63 6c nstanceData, Tcl
25f0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
2600: 20 69 6e 74 20 66 6c 61 67 73 29 20 7b 0a 0a 20 int flags) {..
2610: 20 20 20 69 66 20 28 28 66 6c 61 67 73 20 26 20 if ((flags &
2620: 28 54 43 4c 5f 43 4c 4f 53 45 5f 52 45 41 44 20 (TCL_CLOSE_READ
2630: 7c 20 54 43 4c 5f 43 4c 4f 53 45 5f 57 52 49 54 | TCL_CLOSE_WRIT
2640: 45 29 29 20 3d 3d 20 30 29 20 7b 0a 09 72 65 74 E)) == 0) {..ret
2650: 75 72 6e 20 44 69 67 65 73 74 43 6c 6f 73 65 50 urn DigestCloseP
2660: 72 6f 63 28 69 6e 73 74 61 6e 63 65 44 61 74 61 roc(instanceData
2670: 2c 20 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 7d , interp);. }
2680: 0a 20 20 20 20 72 65 74 75 72 6e 20 45 49 4e 56 . return EINV
2690: 41 4c 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d AL;.}../*. *----
26a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26e0: 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 49 --. *. * DigestI
26f0: 6e 70 75 74 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 nputProc --. *.
2700: 2a 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20 *.Called by the
2710: 67 65 6e 65 72 69 63 20 49 4f 20 73 79 73 74 65 generic IO syste
2720: 6d 20 74 6f 20 72 65 61 64 20 64 61 74 61 20 66 m to read data f
2730: 72 6f 6d 20 74 72 61 6e 73 66 6f 72 6d 20 61 6e rom transform an
2740: 64 0a 20 2a 09 70 6c 61 63 65 20 69 6e 20 62 75 d. *.place in bu
2750: 66 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 f.. *. * Returns
2760: 3a 0a 20 2a 09 54 6f 74 61 6c 20 62 79 74 65 73 :. *.Total bytes
2770: 20 72 65 61 64 20 6f 72 20 2d 31 20 66 6f 72 20 read or -1 for
2780: 61 6e 20 65 72 72 6f 72 20 61 6c 6f 6e 67 20 77 an error along w
2790: 69 74 68 20 61 20 50 4f 53 49 58 20 65 72 72 6f ith a POSIX erro
27a0: 72 0a 20 2a 09 63 6f 64 65 20 69 6e 20 65 72 72 r. *.code in err
27b0: 6f 72 43 6f 64 65 50 74 72 2e 20 55 73 65 20 45 orCodePtr. Use E
27c0: 41 47 41 49 4e 20 66 6f 72 20 6e 6f 6e 62 6c 6f AGAIN for nonblo
27d0: 63 6b 69 6e 67 20 61 6e 64 20 6e 6f 20 64 61 74 cking and no dat
27e0: 61 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 a.. *. * Side ef
27f0: 66 65 63 74 73 3a 0a 20 2a 09 52 65 61 64 20 64 fects:. *.Read d
2800: 61 74 61 20 66 72 6f 6d 20 74 72 61 6e 73 66 6f ata from transfo
2810: 72 6d 20 61 6e 64 20 77 72 69 74 65 20 74 6f 20 rm and write to
2820: 62 75 66 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d buf. *. *-------
2830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
2870: 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 49 6e */.int DigestIn
2880: 70 75 74 50 72 6f 63 28 43 6c 69 65 6e 74 44 61 putProc(ClientDa
2890: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 63 ta clientData, c
28a0: 68 61 72 20 2a 62 75 66 2c 20 69 6e 74 20 74 6f har *buf, int to
28b0: 52 65 61 64 2c 20 69 6e 74 20 2a 65 72 72 6f 72 Read, int *error
28c0: 43 6f 64 65 50 74 72 29 20 7b 0a 20 20 20 20 44 CodePtr) {. D
28d0: 69 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 igestState *stat
28e0: 65 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 ePtr = (DigestSt
28f0: 61 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 ate *) clientDat
2900: 61 3b 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e a;. Tcl_Chann
2910: 65 6c 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 69 el parent;. i
2920: 6e 74 20 72 65 61 64 2c 20 72 65 73 3b 0a 20 20 nt read, res;.
2930: 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 *errorCodePtr
2940: 3d 20 30 3b 0a 0a 20 20 20 20 69 66 20 28 74 6f = 0;.. if (to
2950: 52 65 61 64 20 3c 3d 20 30 20 7c 7c 20 73 74 61 Read <= 0 || sta
2960: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 tePtr->self == (
2970: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
2980: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 3b 0a L) {..return 0;.
2990: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 }.. /* Ge
29a0: 74 20 62 79 74 65 73 20 66 72 6f 6d 20 75 6e 64 t bytes from und
29b0: 65 72 6c 79 69 6e 67 20 63 68 61 6e 6e 65 6c 20 erlying channel
29c0: 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 20 3d 20 */. parent =
29d0: 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 64 43 68 Tcl_GetStackedCh
29e0: 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 72 2d 3e annel(statePtr->
29f0: 73 65 6c 66 29 3b 0a 20 20 20 20 72 65 61 64 20 self);. read
2a00: 3d 20 54 63 6c 5f 52 65 61 64 52 61 77 28 70 61 = Tcl_ReadRaw(pa
2a10: 72 65 6e 74 2c 20 62 75 66 2c 20 74 6f 52 65 61 rent, buf, toRea
2a20: 64 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 d);.. /* Upda
2a30: 74 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e te hash function
2a40: 20 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 61 64 */. if (read
2a50: 20 3e 20 30 29 20 7b 0a 09 69 66 20 28 21 54 6c > 0) {..if (!Tl
2a60: 73 5f 44 69 67 65 73 74 55 70 64 61 74 65 28 73 s_DigestUpdate(s
2a70: 74 61 74 65 50 74 72 2c 20 62 75 66 2c 20 28 73 tatePtr, buf, (s
2a80: 69 7a 65 5f 74 29 20 72 65 61 64 29 29 20 7b 0a ize_t) read)) {.
2a90: 09 20 20 20 20 54 63 6c 5f 53 65 74 43 68 61 6e . Tcl_SetChan
2aa0: 6e 65 6c 45 72 72 6f 72 28 73 74 61 74 65 50 74 nelError(statePt
2ab0: 72 2d 3e 73 65 6c 66 2c 20 54 63 6c 5f 4f 62 6a r->self, Tcl_Obj
2ac0: 50 72 69 6e 74 66 28 22 44 69 67 65 73 74 20 75 Printf("Digest u
2ad0: 70 64 61 74 65 20 66 61 69 6c 65 64 3a 20 25 73 pdate failed: %s
2ae0: 22 2c 20 52 45 41 53 4f 4e 28 29 29 29 3b 0a 09 ", REASON()));..
2af0: 20 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 *errorCodePt
2b00: 72 20 3d 20 45 49 4e 56 41 4c 3b 0a 09 20 20 20 r = EINVAL;..
2b10: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 09 7d 0a 09 return -1;..}..
2b20: 2f 2a 20 54 68 69 73 20 69 73 20 63 6f 72 72 65 /* This is corre
2b30: 63 74 20 2a 2f 0a 09 72 65 61 64 20 3d 20 2d 31 ct */..read = -1
2b40: 3b 0a 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 ;..*errorCodePtr
2b50: 20 3d 20 45 41 47 41 49 4e 3b 0a 09 20 20 20 20 = EAGAIN;..
2b60: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
2b70: 72 65 61 64 20 3c 20 30 29 20 7b 0a 09 2f 2a 20 read < 0) {../*
2b80: 45 72 72 6f 72 20 2a 2f 0a 09 2a 65 72 72 6f 72 Error */..*error
2b90: 43 6f 64 65 50 74 72 20 3d 20 54 63 6c 5f 47 65 CodePtr = Tcl_Ge
2ba0: 74 45 72 72 6e 6f 28 29 3b 0a 0a 20 20 20 20 7d tErrno();.. }
2bb0: 20 65 6c 73 65 20 69 66 20 28 21 28 73 74 61 74 else if (!(stat
2bc0: 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 43 48 ePtr->flags & CH
2bd0: 41 4e 5f 45 4f 46 29 29 20 7b 0a 09 2f 2a 20 45 AN_EOF)) {../* E
2be0: 4f 46 20 2a 2f 0a 09 2a 65 72 72 6f 72 43 6f 64 OF */..*errorCod
2bf0: 65 50 74 72 20 3d 20 30 3b 0a 09 75 6e 73 69 67 ePtr = 0;..unsig
2c00: 6e 65 64 20 63 68 61 72 20 6d 64 5f 62 75 66 5b ned char md_buf[
2c10: 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 5a 45 5d EVP_MAX_MD_SIZE]
2c20: 3b 0a 09 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 ;..unsigned int
2c30: 6d 64 5f 6c 65 6e 20 3d 20 30 3b 0a 0a 09 2f 2a md_len = 0;.../*
2c40: 20 46 69 6e 61 6c 69 7a 65 20 68 61 73 68 20 66 Finalize hash f
2c50: 75 6e 63 74 69 6f 6e 20 61 6e 64 20 63 61 6c 63 unction and calc
2c60: 75 6c 61 74 65 20 6d 65 73 73 61 67 65 20 64 69 ulate message di
2c70: 67 65 73 74 20 2a 2f 0a 09 69 66 20 28 73 74 61 gest */..if (sta
2c80: 74 65 50 74 72 2d 3e 63 74 78 20 21 3d 20 4e 55 tePtr->ctx != NU
2c90: 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65 73 20 3d LL) {.. res =
2ca0: 20 45 56 50 5f 44 69 67 65 73 74 46 69 6e 61 6c EVP_DigestFinal
2cb0: 5f 65 78 28 73 74 61 74 65 50 74 72 2d 3e 63 74 _ex(statePtr->ct
2cc0: 78 2c 20 6d 64 5f 62 75 66 2c 20 26 6d 64 5f 6c x, md_buf, &md_l
2cd0: 65 6e 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 en);..} else {..
2ce0: 20 20 20 20 72 65 73 20 3d 20 48 4d 41 43 5f 46 res = HMAC_F
2cf0: 69 6e 61 6c 28 73 74 61 74 65 50 74 72 2d 3e 68 inal(statePtr->h
2d00: 63 74 78 2c 20 6d 64 5f 62 75 66 2c 20 26 6d 64 ctx, md_buf, &md
2d10: 5f 6c 65 6e 29 3b 0a 09 7d 0a 09 69 66 20 28 21 _len);..}..if (!
2d20: 72 65 73 29 20 7b 0a 09 20 20 20 20 2a 65 72 72 res) {.. *err
2d30: 6f 72 43 6f 64 65 50 74 72 20 3d 20 45 49 4e 56 orCodePtr = EINV
2d40: 41 4c 3b 0a 0a 09 2f 2a 20 57 72 69 74 65 20 6d AL;.../* Write m
2d50: 65 73 73 61 67 65 20 64 69 67 65 73 74 20 74 6f essage digest to
2d60: 20 6f 75 74 70 75 74 20 63 68 61 6e 6e 65 6c 20 output channel
2d70: 61 73 20 62 79 74 65 20 61 72 72 61 79 20 6f 72 as byte array or
2d80: 20 68 65 78 20 73 74 72 69 6e 67 20 2a 2f 0a 09 hex string */..
2d90: 7d 20 65 6c 73 65 20 69 66 20 28 6d 64 5f 6c 65 } else if (md_le
2da0: 6e 20 3e 20 30 29 20 7b 0a 09 20 20 20 20 69 66 n > 0) {.. if
2db0: 20 28 73 74 61 74 65 50 74 72 2d 3e 66 6f 72 6d (statePtr->form
2dc0: 61 74 20 3d 3d 20 42 49 4e 5f 46 4f 52 4d 41 54 at == BIN_FORMAT
2dd0: 20 26 26 20 74 6f 52 65 61 64 20 3e 3d 20 28 69 && toRead >= (i
2de0: 6e 74 29 20 6d 64 5f 6c 65 6e 29 20 7b 0a 09 09 nt) md_len) {...
2df0: 72 65 61 64 20 3d 20 6d 64 5f 6c 65 6e 3b 0a 09 read = md_len;..
2e00: 09 6d 65 6d 63 70 79 28 62 75 66 2c 20 6d 64 5f .memcpy(buf, md_
2e10: 62 75 66 2c 20 72 65 61 64 29 3b 0a 0a 09 20 20 buf, read);...
2e20: 20 20 7d 20 65 6c 73 65 20 69 66 28 73 74 61 74 } else if(stat
2e30: 65 50 74 72 2d 3e 66 6f 72 6d 61 74 20 3d 3d 20 ePtr->format ==
2e40: 48 45 58 5f 46 4f 52 4d 41 54 20 26 26 20 74 6f HEX_FORMAT && to
2e50: 52 65 61 64 20 3e 3d 20 28 69 6e 74 29 20 28 6d Read >= (int) (m
2e60: 64 5f 6c 65 6e 2a 32 29 29 20 7b 0a 09 09 75 6e d_len*2)) {...un
2e70: 73 69 67 6e 65 64 20 63 68 61 72 20 68 65 78 5f signed char hex_
2e80: 62 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 buf[EVP_MAX_MD_S
2e90: 49 5a 45 2a 32 5d 3b 0a 09 09 75 6e 73 69 67 6e IZE*2];...unsign
2ea0: 65 64 20 63 68 61 72 20 2a 70 74 72 20 3d 20 68 ed char *ptr = h
2eb0: 65 78 5f 62 75 66 3b 0a 0a 09 09 66 6f 72 20 28 ex_buf;....for (
2ec0: 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 20 3d unsigned int i =
2ed0: 20 30 3b 20 69 20 3c 20 6d 64 5f 6c 65 6e 3b 20 0; i < md_len;
2ee0: 69 2b 2b 29 20 7b 0a 09 09 20 20 20 20 2a 70 74 i++) {... *pt
2ef0: 72 2b 2b 20 3d 20 68 65 78 5b 28 6d 64 5f 62 75 r++ = hex[(md_bu
2f00: 66 5b 69 5d 20 3e 3e 20 34 29 20 26 20 30 78 30 f[i] >> 4) & 0x0
2f10: 46 5d 3b 0a 09 09 20 20 20 20 2a 70 74 72 2b 2b F];... *ptr++
2f20: 20 3d 20 68 65 78 5b 6d 64 5f 62 75 66 5b 69 5d = hex[md_buf[i]
2f30: 20 26 20 30 78 30 46 5d 3b 0a 09 09 7d 0a 09 09 & 0x0F];...}...
2f40: 72 65 61 64 20 3d 20 6d 64 5f 6c 65 6e 2a 32 3b read = md_len*2;
2f50: 0a 09 09 6d 65 6d 63 70 79 28 62 75 66 2c 20 68 ...memcpy(buf, h
2f60: 65 78 5f 62 75 66 2c 20 72 65 61 64 29 3b 0a 09 ex_buf, read);..
2f70: 20 20 20 20 7d 0a 09 7d 0a 09 73 74 61 74 65 50 }..}..stateP
2f80: 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 43 48 41 tr->flags |= CHA
2f90: 4e 5f 45 4f 46 3b 0a 20 20 20 20 7d 0a 20 20 20 N_EOF;. }.
2fa0: 20 72 65 74 75 72 6e 20 72 65 61 64 3b 0a 7d 0a return read;.}.
2fb0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
2fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
3000: 20 2a 20 44 69 67 65 73 74 4f 75 74 70 75 74 50 * DigestOutputP
3010: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c roc --. *. *.Cal
3020: 6c 65 64 20 62 79 20 74 68 65 20 67 65 6e 65 72 led by the gener
3030: 69 63 20 49 4f 20 73 79 73 74 65 6d 20 74 6f 20 ic IO system to
3040: 77 72 69 74 65 20 64 61 74 61 20 69 6e 20 62 75 write data in bu
3050: 66 20 74 6f 20 74 72 61 6e 73 66 6f 72 6d 2e 0a f to transform..
3060: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 *. * Returns:.
3070: 2a 09 54 6f 74 61 6c 20 62 79 74 65 73 20 77 72 *.Total bytes wr
3080: 69 74 74 65 6e 20 6f 72 20 2d 31 20 66 6f 72 20 itten or -1 for
3090: 61 6e 20 65 72 72 6f 72 20 61 6c 6f 6e 67 20 77 an error along w
30a0: 69 74 68 20 61 20 50 4f 53 49 58 20 65 72 72 6f ith a POSIX erro
30b0: 72 0a 20 2a 09 63 6f 64 65 20 69 6e 20 65 72 72 r. *.code in err
30c0: 6f 72 43 6f 64 65 50 74 72 2e 20 55 73 65 20 45 orCodePtr. Use E
30d0: 41 47 41 49 4e 20 66 6f 72 20 6e 6f 6e 62 6c 6f AGAIN for nonblo
30e0: 63 6b 69 6e 67 20 61 6e 64 20 63 61 6e 27 74 20 cking and can't
30f0: 77 72 69 74 65 20 64 61 74 61 2e 0a 20 2a 0a 20 write data.. *.
3100: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
3110: 20 2a 09 47 65 74 20 64 61 74 61 20 66 72 6f 6d *.Get data from
3120: 20 62 75 66 20 61 6e 64 20 75 70 64 61 74 65 20 buf and update
3130: 64 69 67 65 73 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d digest. *. *----
3140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3180: 2d 2d 0a 20 2a 2f 0a 20 69 6e 74 20 44 69 67 65 --. */. int Dige
3190: 73 74 4f 75 74 70 75 74 50 72 6f 63 28 43 6c 69 stOutputProc(Cli
31a0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
31b0: 74 61 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a ta, const char *
31c0: 62 75 66 2c 20 69 6e 74 20 74 6f 57 72 69 74 65 buf, int toWrite
31d0: 2c 20 69 6e 74 20 2a 65 72 72 6f 72 43 6f 64 65 , int *errorCode
31e0: 50 74 72 29 20 7b 0a 20 20 20 20 44 69 67 65 73 Ptr) {. Diges
31f0: 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 tState *statePtr
3200: 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 = (DigestState
3210: 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 *) clientData;.
3220: 20 20 20 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 *errorCodePtr
3230: 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 20 28 74 = 0;.. if (t
3240: 6f 57 72 69 74 65 20 3c 3d 20 30 20 7c 7c 20 73 oWrite <= 0 || s
3250: 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d tatePtr->self ==
3260: 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e (Tcl_Channel) N
3270: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 30 ULL) {..return 0
3280: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
3290: 55 70 64 61 74 65 20 68 61 73 68 20 66 75 6e 63 Update hash func
32a0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 28 tion */. if (
32b0: 74 6f 57 72 69 74 65 20 3e 20 30 20 26 26 20 21 toWrite > 0 && !
32c0: 54 6c 73 5f 44 69 67 65 73 74 55 70 64 61 74 65 Tls_DigestUpdate
32d0: 28 73 74 61 74 65 50 74 72 2c 20 62 75 66 2c 20 (statePtr, buf,
32e0: 28 73 69 7a 65 5f 74 29 20 74 6f 57 72 69 74 65 (size_t) toWrite
32f0: 29 29 20 7b 0a 09 54 63 6c 5f 53 65 74 43 68 61 )) {..Tcl_SetCha
3300: 6e 6e 65 6c 45 72 72 6f 72 28 73 74 61 74 65 50 nnelError(stateP
3310: 74 72 2d 3e 73 65 6c 66 2c 20 54 63 6c 5f 4f 62 tr->self, Tcl_Ob
3320: 6a 50 72 69 6e 74 66 28 22 44 69 67 65 73 74 20 jPrintf("Digest
3330: 75 70 64 61 74 65 20 66 61 69 6c 65 64 3a 20 25 update failed: %
3340: 73 22 2c 20 52 45 41 53 4f 4e 28 29 29 29 3b 0a s", REASON()));.
3350: 09 2a 65 72 72 6f 72 43 6f 64 65 50 74 72 20 3d .*errorCodePtr =
3360: 20 45 49 4e 56 41 4c 3b 0a 09 72 65 74 75 72 6e EINVAL;..return
3370: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 -1;. }. r
3380: 65 74 75 72 6e 20 74 6f 57 72 69 74 65 3b 0a 7d eturn toWrite;.}
3390: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
33a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
33e0: 0a 20 2a 20 44 69 67 65 73 74 53 65 74 4f 70 74 . * DigestSetOpt
33f0: 69 6f 6e 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a ionProc --. *. *
3400: 09 43 61 6c 6c 65 64 20 62 79 20 74 68 65 20 67 .Called by the g
3410: 65 6e 65 72 69 63 20 49 4f 20 73 79 73 74 65 6d eneric IO system
3420: 20 74 6f 20 73 65 74 20 63 68 61 6e 6e 65 6c 20 to set channel
3430: 6f 70 74 69 6f 6e 20 6e 61 6d 65 20 74 6f 20 76 option name to v
3440: 61 6c 75 65 2e 0a 20 2a 0a 20 2a 20 52 65 74 75 alue.. *. * Retu
3450: 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 69 rns:. *.TCL_OK i
3460: 66 20 73 75 63 63 65 73 73 66 75 6c 20 6f 72 20 f successful or
3470: 54 43 4c 5f 45 52 52 4f 52 20 69 66 20 66 61 69 TCL_ERROR if fai
3480: 6c 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 61 led along with a
3490: 6e 20 65 72 72 6f 72 0a 20 2a 09 6d 65 73 73 61 n error. *.messa
34a0: 67 65 20 69 6e 20 69 6e 74 65 72 70 20 61 6e 64 ge in interp and
34b0: 20 54 63 6c 5f 53 65 74 45 72 72 6e 6f 2e 0a 20 Tcl_SetErrno..
34c0: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
34d0: 73 3a 0a 20 2a 09 55 70 64 61 74 65 73 20 63 68 s:. *.Updates ch
34e0: 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 74 6f 20 annel option to
34f0: 6e 65 77 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a new value.. *. *
3500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3540: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 ------. */.stati
3550: 63 20 69 6e 74 20 44 69 67 65 73 74 53 65 74 4f c int DigestSetO
3560: 70 74 69 6f 6e 50 72 6f 63 28 43 6c 69 65 6e 74 ptionProc(Client
3570: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
3580: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
3590: 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 erp, const char
35a0: 2a 6f 70 74 69 6f 6e 4e 61 6d 65 2c 0a 09 63 6f *optionName,..co
35b0: 6e 73 74 20 63 68 61 72 20 2a 6f 70 74 69 6f 6e nst char *option
35c0: 56 61 6c 75 65 29 20 7b 0a 20 20 20 20 44 69 67 Value) {. Dig
35d0: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 estState *stateP
35e0: 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 tr = (DigestStat
35f0: 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b e *) clientData;
3600: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c . Tcl_Channel
3610: 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 54 63 6c parent;. Tcl
3620: 5f 44 72 69 76 65 72 53 65 74 4f 70 74 69 6f 6e _DriverSetOption
3630: 50 72 6f 63 20 2a 73 65 74 4f 70 74 69 6f 6e 50 Proc *setOptionP
3640: 72 6f 63 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 roc;.. if (st
3650: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 atePtr->self ==
3660: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
3670: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
3680: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
3690: 20 20 20 20 2f 2a 20 44 65 6c 65 67 61 74 65 20 /* Delegate
36a0: 6f 70 74 69 6f 6e 73 20 64 6f 77 6e 73 74 72 65 options downstre
36b0: 61 6d 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 am */. parent
36c0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 = Tcl_GetStacke
36d0: 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 dChannel(statePt
36e0: 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 73 65 r->self);. se
36f0: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 54 63 tOptionProc = Tc
3700: 6c 5f 43 68 61 6e 6e 65 6c 53 65 74 4f 70 74 69 l_ChannelSetOpti
3710: 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 onProc(Tcl_GetCh
3720: 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 6e 74 annelType(parent
3730: 29 29 3b 0a 20 20 20 20 69 66 20 28 73 65 74 4f ));. if (setO
3740: 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c ptionProc != NUL
3750: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28 2a 73 L) {..return (*s
3760: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28 54 63 etOptionProc)(Tc
3770: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 l_GetChannelInst
3780: 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e 74 29 anceData(parent)
3790: 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e , interp, option
37a0: 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 6c 75 Name, optionValu
37b0: 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b e);. } else {
37c0: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f 28 45 ..Tcl_SetErrno(E
37d0: 49 4e 56 41 4c 29 3b 0a 09 72 65 74 75 72 6e 20 INVAL);..return
37e0: 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c 4f 70 Tcl_BadChannelOp
37f0: 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f 70 74 tion(interp, opt
3800: 69 6f 6e 4e 61 6d 65 2c 20 4e 55 4c 4c 29 3b 0a ionName, NULL);.
3810: 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d }.}../*. *--
3820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3860: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 ----. *. * Diges
3870: 74 47 65 74 4f 70 74 69 6f 6e 50 72 6f 63 20 2d tGetOptionProc -
3880: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 62 -. *. *.Called b
3890: 79 20 74 68 65 20 67 65 6e 65 72 69 63 20 49 4f y the generic IO
38a0: 20 73 79 73 74 65 6d 20 74 6f 20 67 65 74 20 63 system to get c
38b0: 68 61 6e 6e 65 6c 20 6f 70 74 69 6f 6e 20 6e 61 hannel option na
38c0: 6d 65 27 73 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 me's value.. *.
38d0: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 * Returns:. *.TC
38e0: 4c 5f 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 L_OK if successf
38f0: 75 6c 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 ul or TCL_ERROR
3900: 69 66 20 66 61 69 6c 65 64 20 61 6c 6f 6e 67 20 if failed along
3910: 77 69 74 68 20 61 6e 20 65 72 72 6f 72 0a 20 2a with an error. *
3920: 09 6d 65 73 73 61 67 65 20 69 6e 20 69 6e 74 65 .message in inte
3930: 72 70 20 61 6e 64 20 54 63 6c 5f 53 65 74 45 72 rp and Tcl_SetEr
3940: 72 6e 6f 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 rno.. *. * Side
3950: 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 effects:. *.Sets
3960: 20 72 65 73 75 6c 74 20 74 6f 20 6f 70 74 69 6f result to optio
3970: 6e 27 73 20 76 61 6c 75 65 0a 20 2a 0a 20 2a 2d n's value. *. *-
3980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
39d0: 20 69 6e 74 20 44 69 67 65 73 74 47 65 74 4f 70 int DigestGetOp
39e0: 74 69 6f 6e 50 72 6f 63 28 43 6c 69 65 6e 74 44 tionProc(ClientD
39f0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
3a00: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
3a10: 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a rp, const char *
3a20: 6f 70 74 69 6f 6e 4e 61 6d 65 2c 0a 09 54 63 6c optionName,..Tcl
3a30: 5f 44 53 74 72 69 6e 67 20 2a 6f 70 74 69 6f 6e _DString *option
3a40: 56 61 6c 75 65 29 20 7b 0a 20 20 20 20 44 69 67 Value) {. Dig
3a50: 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 estState *stateP
3a60: 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 tr = (DigestStat
3a70: 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b e *) clientData;
3a80: 0a 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c . Tcl_Channel
3a90: 20 70 61 72 65 6e 74 3b 0a 20 20 20 20 54 63 6c parent;. Tcl
3aa0: 5f 44 72 69 76 65 72 47 65 74 4f 70 74 69 6f 6e _DriverGetOption
3ab0: 50 72 6f 63 20 2a 67 65 74 4f 70 74 69 6f 6e 50 Proc *getOptionP
3ac0: 72 6f 63 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 roc;.. if (st
3ad0: 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 atePtr->self ==
3ae0: 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 (Tcl_Channel) NU
3af0: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
3b00: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
3b10: 20 20 20 20 2f 2a 20 44 65 6c 65 67 61 74 65 20 /* Delegate
3b20: 6f 70 74 69 6f 6e 73 20 64 6f 77 6e 73 74 72 65 options downstre
3b30: 61 6d 20 2a 2f 0a 20 20 20 20 70 61 72 65 6e 74 am */. parent
3b40: 20 3d 20 54 63 6c 5f 47 65 74 53 74 61 63 6b 65 = Tcl_GetStacke
3b50: 64 43 68 61 6e 6e 65 6c 28 73 74 61 74 65 50 74 dChannel(statePt
3b60: 72 2d 3e 73 65 6c 66 29 3b 0a 20 20 20 20 67 65 r->self);. ge
3b70: 74 4f 70 74 69 6f 6e 50 72 6f 63 20 3d 20 54 63 tOptionProc = Tc
3b80: 6c 5f 43 68 61 6e 6e 65 6c 47 65 74 4f 70 74 69 l_ChannelGetOpti
3b90: 6f 6e 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 onProc(Tcl_GetCh
3ba0: 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 6e 74 annelType(parent
3bb0: 29 29 3b 0a 20 20 20 20 69 66 20 28 67 65 74 4f ));. if (getO
3bc0: 70 74 69 6f 6e 50 72 6f 63 20 21 3d 20 4e 55 4c ptionProc != NUL
3bd0: 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 28 2a 67 L) {..return (*g
3be0: 65 74 4f 70 74 69 6f 6e 50 72 6f 63 29 28 54 63 etOptionProc)(Tc
3bf0: 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 l_GetChannelInst
3c00: 61 6e 63 65 44 61 74 61 28 70 61 72 65 6e 74 29 anceData(parent)
3c10: 2c 20 69 6e 74 65 72 70 2c 20 6f 70 74 69 6f 6e , interp, option
3c20: 4e 61 6d 65 2c 20 6f 70 74 69 6f 6e 56 61 6c 75 Name, optionValu
3c30: 65 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 e);. } else i
3c40: 66 20 28 6f 70 74 69 6f 6e 4e 61 6d 65 20 3d 3d f (optionName ==
3c50: 20 28 63 68 61 72 2a 29 20 4e 55 4c 4c 29 20 7b (char*) NULL) {
3c60: 0a 09 2f 2a 20 52 65 71 75 65 73 74 20 69 73 20 ../* Request is
3c70: 71 75 65 72 79 20 66 6f 72 20 61 6c 6c 20 6f 70 query for all op
3c80: 74 69 6f 6e 73 2c 20 74 68 69 73 20 69 73 20 6f tions, this is o
3c90: 6b 2e 20 2a 2f 0a 09 72 65 74 75 72 6e 20 54 43 k. */..return TC
3ca0: 4c 5f 4f 4b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 L_OK;. } else
3cb0: 20 7b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6e 6f {..Tcl_SetErrno
3cc0: 28 45 49 4e 56 41 4c 29 3b 0a 09 72 65 74 75 72 (EINVAL);..retur
3cd0: 6e 20 54 63 6c 5f 42 61 64 43 68 61 6e 6e 65 6c n Tcl_BadChannel
3ce0: 4f 70 74 69 6f 6e 28 69 6e 74 65 72 70 2c 20 6f Option(interp, o
3cf0: 70 74 69 6f 6e 4e 61 6d 65 2c 20 4e 55 4c 4c 29 ptionName, NULL)
3d00: 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a ;. }.}../*. *
3d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3d40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3d50: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 ------. *. * Dig
3d60: 65 73 74 54 69 6d 65 72 48 61 6e 64 6c 65 72 20 estTimerHandler
3d70: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 --. *. *.Called
3d80: 62 79 20 74 68 65 20 6e 6f 74 69 66 69 65 72 20 by the notifier
3d90: 76 69 61 20 74 69 6d 65 72 20 74 6f 20 66 6c 75 via timer to flu
3da0: 73 68 20 6f 75 74 20 70 65 6e 64 69 6e 67 20 69 sh out pending i
3db0: 6e 70 75 74 20 64 61 74 61 2e 0a 20 2a 0a 20 2a nput data.. *. *
3dc0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74 Returns:. *.Not
3dd0: 68 69 6e 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 hing. *. * Side
3de0: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 effects:. *.May
3df0: 63 61 6c 6c 20 54 63 6c 5f 4e 6f 74 69 66 79 43 call Tcl_NotifyC
3e00: 68 61 6e 6e 65 6c 0a 20 2a 0a 20 2a 2d 2d 2d 2d hannel. *. *----
3e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e50: 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f --. */.static vo
3e60: 69 64 20 44 69 67 65 73 74 54 69 6d 65 72 48 61 id DigestTimerHa
3e70: 6e 64 6c 65 72 28 43 6c 69 65 6e 74 44 61 74 61 ndler(ClientData
3e80: 20 63 6c 69 65 6e 74 44 61 74 61 29 20 7b 0a 20 clientData) {.
3e90: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a DigestState *
3ea0: 73 74 61 74 65 50 74 72 20 3d 20 28 44 69 67 65 statePtr = (Dige
3eb0: 73 74 53 74 61 74 65 20 2a 29 20 63 6c 69 65 6e stState *) clien
3ec0: 74 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 28 tData;.. if (
3ed0: 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d statePtr->self =
3ee0: 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 = (Tcl_Channel)
3ef0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 3b NULL) {..return;
3f00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
3f10: 6c 65 61 72 20 74 69 6d 65 72 20 74 6f 6b 65 6e lear timer token
3f20: 20 2a 2f 0a 20 20 20 20 73 74 61 74 65 50 74 72 */. statePtr
3f30: 2d 3e 74 69 6d 65 72 20 3d 20 28 54 63 6c 5f 54 ->timer = (Tcl_T
3f40: 69 6d 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b imerToken) NULL;
3f50: 0a 0a 20 20 20 20 2f 2a 20 46 69 72 65 20 65 76 .. /* Fire ev
3f60: 65 6e 74 20 69 66 20 74 68 65 72 65 20 69 73 20 ent if there is
3f70: 70 65 6e 64 69 6e 67 20 64 61 74 61 2c 20 73 6b pending data, sk
3f80: 69 70 20 6f 74 68 65 72 77 69 73 65 20 2a 2f 0a ip otherwise */.
3f90: 20 20 20 20 69 66 20 28 28 73 74 61 74 65 50 74 if ((statePt
3fa0: 72 2d 3e 77 61 74 63 68 4d 61 73 6b 20 26 20 54 r->watchMask & T
3fb0: 43 4c 5f 52 45 41 44 41 42 4c 45 29 20 26 26 20 CL_READABLE) &&
3fc0: 28 54 63 6c 5f 49 6e 70 75 74 42 75 66 66 65 72 (Tcl_InputBuffer
3fd0: 65 64 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c ed(statePtr->sel
3fe0: 66 29 20 3e 20 30 29 29 20 7b 0a 09 54 63 6c 5f f) > 0)) {..Tcl_
3ff0: 4e 6f 74 69 66 79 43 68 61 6e 6e 65 6c 28 73 74 NotifyChannel(st
4000: 61 74 65 50 74 72 2d 3e 73 65 6c 66 2c 20 54 43 atePtr->self, TC
4010: 4c 5f 52 45 41 44 41 42 4c 45 29 3b 0a 20 20 20 L_READABLE);.
4020: 20 7d 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d }.}../*. *-----
4030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4070: 2d 0a 20 2a 0a 20 2a 20 44 69 67 65 73 74 57 61 -. *. * DigestWa
4080: 74 63 68 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a tchProc --. *. *
4090: 09 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 .Initialize the
40a0: 6e 6f 74 69 66 69 65 72 20 74 6f 20 77 61 74 63 notifier to watc
40b0: 68 20 66 6f 72 20 65 76 65 6e 74 73 20 66 72 6f h for events fro
40c0: 6d 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 2e 0a m this channel..
40d0: 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 *. * Returns:.
40e0: 2a 09 4e 6f 74 68 69 6e 67 0a 20 2a 0a 20 2a 20 *.Nothing. *. *
40f0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
4100: 09 43 6f 6e 66 69 67 75 72 65 20 6e 6f 74 69 66 .Configure notif
4110: 69 65 72 20 73 6f 20 66 75 74 75 72 65 20 65 76 ier so future ev
4120: 65 6e 74 73 20 6f 6e 20 74 68 65 20 63 68 61 6e ents on the chan
4130: 6e 65 6c 20 77 69 6c 6c 20 62 65 20 73 65 65 6e nel will be seen
4140: 20 62 79 20 54 63 6c 2e 0a 20 2a 0a 20 2a 2d 2d by Tcl.. *. *--
4150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4190: 2d 2d 2d 2d 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 ----. */.#define
41a0: 20 52 45 41 44 5f 44 45 4c 41 59 09 35 0a 76 6f READ_DELAY.5.vo
41b0: 69 64 20 44 69 67 65 73 74 57 61 74 63 68 50 72 id DigestWatchPr
41c0: 6f 63 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c oc(ClientData cl
41d0: 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 20 6d 61 ientData, int ma
41e0: 73 6b 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 sk) {. Digest
41f0: 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 State *statePtr
4200: 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a = (DigestState *
4210: 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 ) clientData;.
4220: 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 70 61 Tcl_Channel pa
4230: 72 65 6e 74 3b 0a 20 20 20 20 54 63 6c 5f 44 72 rent;. Tcl_Dr
4240: 69 76 65 72 57 61 74 63 68 50 72 6f 63 20 2a 77 iverWatchProc *w
4250: 61 74 63 68 50 72 6f 63 3b 0a 0a 20 20 20 20 69 atchProc;.. i
4260: 66 20 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c f (statePtr->sel
4270: 66 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e 6e 65 f == (Tcl_Channe
4280: 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 l) NULL) {..retu
4290: 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f rn;. }.. /
42a0: 2a 20 53 74 6f 72 65 20 4f 52 2d 65 64 20 63 6f * Store OR-ed co
42b0: 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 54 43 4c mbination of TCL
42c0: 5f 52 45 41 44 41 42 4c 45 2c 20 54 43 4c 5f 57 _READABLE, TCL_W
42d0: 52 49 54 41 42 4c 45 20 61 6e 64 20 54 43 4c 5f RITABLE and TCL_
42e0: 45 58 43 45 50 54 49 4f 4e 20 2a 2f 0a 20 20 20 EXCEPTION */.
42f0: 20 73 74 61 74 65 50 74 72 2d 3e 77 61 74 63 68 statePtr->watch
4300: 4d 61 73 6b 20 3d 20 6d 61 73 6b 3b 0a 0a 20 20 Mask = mask;..
4310: 20 20 2f 2a 20 50 72 6f 70 61 67 61 74 65 20 6d /* Propagate m
4320: 61 73 6b 20 69 6e 66 6f 20 74 6f 20 70 61 72 65 ask info to pare
4330: 6e 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 nt channel */.
4340: 20 20 70 61 72 65 6e 74 20 3d 20 54 63 6c 5f 47 parent = Tcl_G
4350: 65 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 6c etStackedChannel
4360: 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 29 (statePtr->self)
4370: 3b 0a 20 20 20 20 77 61 74 63 68 50 72 6f 63 20 ;. watchProc
4380: 3d 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 57 61 74 = Tcl_ChannelWat
4390: 63 68 50 72 6f 63 28 54 63 6c 5f 47 65 74 43 68 chProc(Tcl_GetCh
43a0: 61 6e 6e 65 6c 54 79 70 65 28 70 61 72 65 6e 74 annelType(parent
43b0: 29 29 3b 0a 20 20 20 20 77 61 74 63 68 50 72 6f ));. watchPro
43c0: 63 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c c(Tcl_GetChannel
43d0: 49 6e 73 74 61 6e 63 65 44 61 74 61 28 70 61 72 InstanceData(par
43e0: 65 6e 74 29 2c 20 6d 61 73 6b 29 3b 0a 0a 20 20 ent), mask);..
43f0: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 70 65 6e 64 /* Remove pend
4400: 69 6e 67 20 74 69 6d 65 72 20 2a 2f 0a 20 20 20 ing timer */.
4410: 20 69 66 20 28 73 74 61 74 65 50 74 72 2d 3e 74 if (statePtr->t
4420: 69 6d 65 72 20 21 3d 20 28 54 63 6c 5f 54 69 6d imer != (Tcl_Tim
4430: 65 72 54 6f 6b 65 6e 29 20 4e 55 4c 4c 29 20 7b erToken) NULL) {
4440: 0a 09 54 63 6c 5f 44 65 6c 65 74 65 54 69 6d 65 ..Tcl_DeleteTime
4450: 72 48 61 6e 64 6c 65 72 28 73 74 61 74 65 50 74 rHandler(statePt
4460: 72 2d 3e 74 69 6d 65 72 29 3b 0a 09 73 74 61 74 r->timer);..stat
4470: 65 50 74 72 2d 3e 74 69 6d 65 72 20 3d 20 28 54 ePtr->timer = (T
4480: 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 20 4e cl_TimerToken) N
4490: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
44a0: 2f 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 64 /* If there is d
44b0: 61 74 61 20 70 65 6e 64 69 6e 67 2c 20 73 65 74 ata pending, set
44c0: 20 6e 65 77 20 74 69 6d 65 72 20 74 6f 20 63 61 new timer to ca
44d0: 6c 6c 20 54 63 6c 5f 4e 6f 74 69 66 79 43 68 61 ll Tcl_NotifyCha
44e0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 69 66 20 28 nnel */. if (
44f0: 28 6d 61 73 6b 20 26 20 54 43 4c 5f 52 45 41 44 (mask & TCL_READ
4500: 41 42 4c 45 29 20 26 26 20 28 54 63 6c 5f 49 6e ABLE) && (Tcl_In
4510: 70 75 74 42 75 66 66 65 72 65 64 28 73 74 61 74 putBuffered(stat
4520: 65 50 74 72 2d 3e 73 65 6c 66 29 20 3e 20 30 29 ePtr->self) > 0)
4530: 29 20 7b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 ) {..statePtr->t
4540: 69 6d 65 72 20 3d 20 54 63 6c 5f 43 72 65 61 74 imer = Tcl_Creat
4550: 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 28 52 45 eTimerHandler(RE
4560: 41 44 5f 44 45 4c 41 59 2c 20 44 69 67 65 73 74 AD_DELAY, Digest
4570: 54 69 6d 65 72 48 61 6e 64 6c 65 72 2c 20 28 43 TimerHandler, (C
4580: 6c 69 65 6e 74 44 61 74 61 29 20 73 74 61 74 65 lientData) state
4590: 50 74 72 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 2f Ptr);. }.}../
45a0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
45b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
45c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
45d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
45e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
45f0: 20 44 69 67 65 73 74 47 65 74 48 61 6e 64 6c 65 DigestGetHandle
4600: 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 43 61 Proc --. *. *.Ca
4610: 6c 6c 65 64 20 66 72 6f 6d 20 54 63 6c 5f 47 65 lled from Tcl_Ge
4620: 74 43 68 61 6e 6e 65 6c 48 61 6e 64 6c 65 20 74 tChannelHandle t
4630: 6f 20 72 65 74 72 69 65 76 65 20 4f 53 20 73 70 o retrieve OS sp
4640: 65 63 69 66 69 63 20 66 69 6c 65 20 68 61 6e 64 ecific file hand
4650: 6c 65 0a 20 2a 09 66 72 6f 6d 20 69 6e 73 69 64 le. *.from insid
4660: 65 20 74 68 69 73 20 63 68 61 6e 6e 65 6c 2e 20 e this channel.
4670: 4e 6f 74 20 75 73 65 64 20 66 6f 72 20 74 72 61 Not used for tra
4680: 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 3f 0a 20 2a nsformations?. *
4690: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 . * Returns:. *.
46a0: 54 43 4c 5f 4f 4b 20 66 6f 72 20 73 75 63 63 65 TCL_OK for succe
46b0: 73 73 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 20 ss or TCL_ERROR
46c0: 66 6f 72 20 65 72 72 6f 72 20 6f 72 20 69 66 20 for error or if
46d0: 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 2e 20 49 not supported. I
46e0: 66 0a 20 2a 09 64 69 72 65 63 74 69 6f 6e 20 69 f. *.direction i
46f0: 73 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 2c 20 s TCL_READABLE,
4700: 73 65 74 73 20 68 61 6e 64 6c 65 50 74 72 20 74 sets handlePtr t
4710: 6f 20 74 68 65 20 68 61 6e 64 6c 65 20 75 73 65 o the handle use
4720: 64 20 66 6f 72 0a 20 2a 09 69 6e 70 75 74 2c 20 d for. *.input,
4730: 6f 72 20 69 66 20 54 43 4c 5f 57 52 49 54 41 42 or if TCL_WRITAB
4740: 4c 45 20 73 65 74 73 20 74 6f 20 74 68 65 20 68 LE sets to the h
4750: 61 6e 64 6c 65 20 75 73 65 64 20 66 6f 72 20 6f andle used for o
4760: 75 74 70 75 74 2e 0a 20 2a 0a 20 2a 20 53 69 64 utput.. *. * Sid
4770: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
4780: 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ne. *. *--------
4790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
47d0: 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 47 65 74 */.int DigestGet
47e0: 48 61 6e 64 6c 65 50 72 6f 63 28 43 6c 69 65 6e HandleProc(Clien
47f0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
4800: 2c 20 69 6e 74 20 64 69 72 65 63 74 69 6f 6e 2c , int direction,
4810: 20 43 6c 69 65 6e 74 44 61 74 61 20 2a 68 61 6e ClientData *han
4820: 64 6c 65 50 74 72 29 20 7b 0a 20 20 20 20 44 69 dlePtr) {. Di
4830: 67 65 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 gestState *state
4840: 50 74 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 Ptr = (DigestSta
4850: 74 65 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 te *) clientData
4860: 3b 0a 0a 20 20 20 20 69 66 20 28 73 74 61 74 65 ;.. if (state
4870: 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 54 63 Ptr->self == (Tc
4880: 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 l_Channel) NULL)
4890: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
48a0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
48b0: 72 65 74 75 72 6e 20 54 63 6c 5f 47 65 74 43 68 return Tcl_GetCh
48c0: 61 6e 6e 65 6c 48 61 6e 64 6c 65 28 54 63 6c 5f annelHandle(Tcl_
48d0: 47 65 74 53 74 61 63 6b 65 64 43 68 61 6e 6e 65 GetStackedChanne
48e0: 6c 28 73 74 61 74 65 50 74 72 2d 3e 73 65 6c 66 l(statePtr->self
48f0: 29 2c 20 64 69 72 65 63 74 69 6f 6e 2c 20 68 61 ), direction, ha
4900: 6e 64 6c 65 50 74 72 29 3b 0a 7d 0a 0a 2f 2a 0a ndlePtr);.}../*.
4910: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
4920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4950: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 --------. *. * D
4960: 69 67 65 73 74 4e 6f 74 69 66 79 50 72 6f 63 20 igestNotifyProc
4970: 2d 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 --. *. *.Called
4980: 62 79 20 54 63 6c 20 74 6f 20 69 6e 66 6f 72 6d by Tcl to inform
4990: 20 75 73 20 6f 66 20 61 63 74 69 76 69 74 79 20 us of activity
49a0: 6f 6e 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e on the underlyin
49b0: 67 20 63 68 61 6e 6e 65 6c 2e 0a 20 2a 0a 20 2a g channel.. *. *
49c0: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 55 6e 63 Returns:. *.Unc
49d0: 68 61 6e 67 65 64 20 69 6e 74 65 72 65 73 74 4d hanged interestM
49e0: 61 73 6b 20 77 68 69 63 68 20 69 73 20 61 6e 20 ask which is an
49f0: 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 74 69 6f OR-ed combinatio
4a00: 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 41 42 4c n of TCL_READABL
4a10: 45 20 6f 72 20 54 43 4c 5f 57 52 49 54 41 42 4c E or TCL_WRITABL
4a20: 45 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 E. *. * Side eff
4a30: 65 63 74 73 3a 0a 20 2a 09 43 61 6e 63 65 6c 73 ects:. *.Cancels
4a40: 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 74 69 6d any pending tim
4a50: 65 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d er.. *. *-------
4a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
4aa0: 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 74 4e 6f */.int DigestNo
4ab0: 74 69 66 79 50 72 6f 63 28 43 6c 69 65 6e 74 44 tifyProc(ClientD
4ac0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 ata clientData,
4ad0: 69 6e 74 20 69 6e 74 65 72 65 73 74 4d 61 73 6b int interestMask
4ae0: 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 74 ) {. DigestSt
4af0: 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d 20 ate *statePtr =
4b00: 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 20 (DigestState *)
4b10: 63 6c 69 65 6e 74 44 61 74 61 3b 0a 0a 20 20 20 clientData;..
4b20: 20 2f 2a 20 53 6b 69 70 20 74 69 6d 65 72 20 65 /* Skip timer e
4b30: 76 65 6e 74 20 61 73 20 72 65 64 75 6e 64 61 6e vent as redundan
4b40: 74 20 2a 2f 0a 20 20 20 20 69 66 20 28 73 74 61 t */. if (sta
4b50: 74 65 50 74 72 2d 3e 74 69 6d 65 72 20 21 3d 20 tePtr->timer !=
4b60: 28 54 63 6c 5f 54 69 6d 65 72 54 6f 6b 65 6e 29 (Tcl_TimerToken)
4b70: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 44 65 NULL) {..Tcl_De
4b80: 6c 65 74 65 54 69 6d 65 72 48 61 6e 64 6c 65 72 leteTimerHandler
4b90: 28 73 74 61 74 65 50 74 72 2d 3e 74 69 6d 65 72 (statePtr->timer
4ba0: 29 3b 0a 09 73 74 61 74 65 50 74 72 2d 3e 74 69 );..statePtr->ti
4bb0: 6d 65 72 20 3d 20 28 54 63 6c 5f 54 69 6d 65 72 mer = (Tcl_Timer
4bc0: 54 6f 6b 65 6e 29 20 4e 55 4c 4c 3b 0a 20 20 20 Token) NULL;.
4bd0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 69 6e }. return in
4be0: 74 65 72 65 73 74 4d 61 73 6b 3b 0a 7d 0a 0a 2f terestMask;.}../
4bf0: 2a 0a 20 2a 0a 20 2a 20 43 68 61 6e 6e 65 6c 20 *. *. * Channel
4c00: 74 79 70 65 20 73 74 72 75 63 74 75 72 65 20 64 type structure d
4c10: 65 66 69 6e 69 74 69 6f 6e 20 66 6f 72 20 64 69 efinition for di
4c20: 67 65 73 74 20 74 72 61 6e 73 66 6f 72 6d 61 74 gest transformat
4c30: 69 6f 6e 73 2e 0a 20 2a 0a 20 2a 2f 0a 73 74 61 ions.. *. */.sta
4c40: 74 69 63 20 63 6f 6e 73 74 20 54 63 6c 5f 43 68 tic const Tcl_Ch
4c50: 61 6e 6e 65 6c 54 79 70 65 20 64 69 67 65 73 74 annelType digest
4c60: 43 68 61 6e 6e 65 6c 54 79 70 65 20 3d 20 7b 0a ChannelType = {.
4c70: 20 20 20 20 22 64 69 67 65 73 74 22 2c 09 09 09 "digest",...
4c80: 2f 2a 20 54 79 70 65 20 6e 61 6d 65 20 2a 2f 0a /* Type name */.
4c90: 20 20 20 20 54 43 4c 5f 43 48 41 4e 4e 45 4c 5f TCL_CHANNEL_
4ca0: 56 45 52 53 49 4f 4e 5f 35 2c 09 2f 2a 20 76 35 VERSION_5,./* v5
4cb0: 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 channel */.
4cc0: 44 69 67 65 73 74 43 6c 6f 73 65 50 72 6f 63 2c DigestCloseProc,
4cd0: 09 09 2f 2a 20 43 6c 6f 73 65 20 70 72 6f 63 20 ../* Close proc
4ce0: 2a 2f 0a 20 20 20 20 44 69 67 65 73 74 49 6e 70 */. DigestInp
4cf0: 75 74 50 72 6f 63 2c 09 09 2f 2a 20 49 6e 70 75 utProc,../* Inpu
4d00: 74 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 69 t proc */. Di
4d10: 67 65 73 74 4f 75 74 70 75 74 50 72 6f 63 2c 09 gestOutputProc,.
4d20: 09 2f 2a 20 4f 75 74 70 75 74 20 70 72 6f 63 20 ./* Output proc
4d30: 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f */. NULL,.../
4d40: 2a 20 53 65 65 6b 20 70 72 6f 63 20 2a 2f 0a 20 * Seek proc */.
4d50: 20 20 20 44 69 67 65 73 74 53 65 74 4f 70 74 69 DigestSetOpti
4d60: 6f 6e 50 72 6f 63 2c 09 2f 2a 20 53 65 74 20 6f onProc,./* Set o
4d70: 70 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 20 ption proc */.
4d80: 20 20 44 69 67 65 73 74 47 65 74 4f 70 74 69 6f DigestGetOptio
4d90: 6e 50 72 6f 63 2c 09 2f 2a 20 47 65 74 20 6f 70 nProc,./* Get op
4da0: 74 69 6f 6e 20 70 72 6f 63 20 2a 2f 0a 20 20 20 tion proc */.
4db0: 20 44 69 67 65 73 74 57 61 74 63 68 50 72 6f 63 DigestWatchProc
4dc0: 2c 09 09 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 ,../* Initialize
4dd0: 20 6e 6f 74 69 66 69 65 72 20 2a 2f 0a 20 20 20 notifier */.
4de0: 20 44 69 67 65 73 74 47 65 74 48 61 6e 64 6c 65 DigestGetHandle
4df0: 50 72 6f 63 2c 09 2f 2a 20 47 65 74 20 4f 53 20 Proc,./* Get OS
4e00: 68 61 6e 64 6c 65 73 20 6f 75 74 20 6f 66 20 63 handles out of c
4e10: 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 44 69 hannel */. Di
4e20: 67 65 73 74 43 6c 6f 73 65 32 50 72 6f 63 2c 09 gestClose2Proc,.
4e30: 09 2f 2a 20 63 6c 6f 73 65 32 70 72 6f 63 20 2a ./* close2proc *
4e40: 2f 0a 20 20 20 20 44 69 67 65 73 74 42 6c 6f 63 /. DigestBloc
4e50: 6b 4d 6f 64 65 50 72 6f 63 2c 09 2f 2a 20 53 65 kModeProc,./* Se
4e60: 74 20 62 6c 6f 63 6b 69 6e 67 2f 6e 6f 6e 62 6c t blocking/nonbl
4e70: 6f 63 6b 69 6e 67 20 6d 6f 64 65 2a 2f 0a 20 20 ocking mode*/.
4e80: 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 46 6c 75 NULL,.../* Flu
4e90: 73 68 20 70 72 6f 63 20 2a 2f 0a 20 20 20 20 44 sh proc */. D
4ea0: 69 67 65 73 74 4e 6f 74 69 66 79 50 72 6f 63 2c igestNotifyProc,
4eb0: 09 09 2f 2a 20 48 61 6e 64 6c 69 6e 67 20 6f 66 ../* Handling of
4ec0: 20 65 76 65 6e 74 73 20 62 75 62 62 6c 69 6e 67 events bubbling
4ed0: 20 75 70 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c up */. NULL,
4ee0: 09 09 09 2f 2a 20 57 69 64 65 20 73 65 65 6b 20 .../* Wide seek
4ef0: 70 72 6f 63 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c proc */. NULL
4f00: 2c 09 09 09 2f 2a 20 54 68 72 65 61 64 20 61 63 ,.../* Thread ac
4f10: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c tion */. NULL
4f20: 09 09 09 2f 2a 20 54 72 75 6e 63 61 74 65 20 2a .../* Truncate *
4f30: 2f 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d /.};../*. *-----
4f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4f80: 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 -. *. * Tls_Dige
4f90: 73 74 43 68 61 6e 6e 65 6c 20 2d 2d 0a 20 2a 0a stChannel --. *.
4fa0: 20 2a 09 43 72 65 61 74 65 20 61 20 73 74 61 63 *.Create a stac
4fb0: 6b 65 64 20 63 68 61 6e 6e 65 6c 20 66 6f 72 20 ked channel for
4fc0: 61 20 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 a message digest
4fd0: 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 2e transformation.
4fe0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a . *. * Returns:.
4ff0: 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c *.TCL_OK or TCL
5000: 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 _ERROR. *. * Sid
5010: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 41 64 e effects:. *.Ad
5020: 64 73 20 74 72 61 6e 73 66 6f 72 6d 20 74 6f 20 ds transform to
5030: 63 68 61 6e 6e 65 6c 20 61 6e 64 20 73 65 74 73 channel and sets
5040: 20 72 65 73 75 6c 74 20 74 6f 20 63 68 61 6e 6e result to chann
5050: 65 6c 20 6e 61 6d 65 20 6f 72 20 65 72 72 6f 72 el name or error
5060: 20 6d 65 73 73 61 67 65 2e 0a 20 2a 0a 20 2a 2d message.. *. *-
5070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
50a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
50b0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 -----. */.static
50c0: 20 69 6e 74 0a 54 6c 73 5f 44 69 67 65 73 74 43 int.Tls_DigestC
50d0: 68 61 6e 6e 65 6c 28 54 63 6c 5f 49 6e 74 65 72 hannel(Tcl_Inter
50e0: 70 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 p *interp, const
50f0: 20 63 68 61 72 20 2a 63 68 61 6e 6e 65 6c 2c 20 char *channel,
5100: 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 const EVP_MD *md
5110: 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c 0a 09 54 , int format,..T
5120: 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 29 20 cl_Obj *keyObj)
5130: 7b 0a 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 20 {. int mode;
5140: 2f 2a 20 4f 52 2d 65 64 20 63 6f 6d 62 69 6e 61 /* OR-ed combina
5150: 74 69 6f 6e 20 6f 66 20 54 43 4c 5f 52 45 41 44 tion of TCL_READ
5160: 41 42 4c 45 20 61 6e 64 20 54 43 4c 5f 57 52 49 ABLE and TCL_WRI
5170: 54 41 42 4c 45 20 2a 2f 0a 20 20 20 20 54 63 6c TABLE */. Tcl
5180: 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 _Channel chan;.
5190: 20 20 20 44 69 67 65 73 74 53 74 61 74 65 20 2a DigestState *
51a0: 73 74 61 74 65 50 74 72 3b 0a 20 20 20 20 45 56 statePtr;. EV
51b0: 50 5f 4d 44 5f 43 54 58 20 2a 63 74 78 20 3d 20 P_MD_CTX *ctx =
51c0: 28 45 56 50 5f 4d 44 5f 43 54 58 20 2a 29 20 4e (EVP_MD_CTX *) N
51d0: 55 4c 4c 3b 0a 20 20 20 20 48 4d 41 43 5f 43 54 ULL;. HMAC_CT
51e0: 58 20 2a 68 63 74 78 20 3d 20 28 48 4d 41 43 5f X *hctx = (HMAC_
51f0: 43 54 58 20 2a 29 20 4e 55 4c 4c 3b 0a 0a 20 20 CTX *) NULL;..
5200: 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 61 72 /* Validate ar
5210: 67 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 63 68 gs */. if (ch
5220: 61 6e 6e 65 6c 20 3d 3d 20 28 63 6f 6e 73 74 20 annel == (const
5230: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 20 7c 7c 20 char *) NULL ||
5240: 6d 64 20 3d 3d 20 28 63 6f 6e 73 74 20 45 56 50 md == (const EVP
5250: 5f 4d 44 20 2a 29 20 4e 55 4c 4c 29 20 7b 0a 09 _MD *) NULL) {..
5260: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
5270: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 ;. }.. cha
5280: 6e 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e n = Tcl_GetChann
5290: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e el(interp, chann
52a0: 65 6c 2c 20 26 6d 6f 64 65 29 3b 0a 20 20 20 20 el, &mode);.
52b0: 69 66 20 28 63 68 61 6e 20 3d 3d 20 28 54 63 6c if (chan == (Tcl
52c0: 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c 4c 29 20 _Channel) NULL)
52d0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
52e0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
52f0: 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 6f 20 /* Make sure to
5300: 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20 74 operate on the t
5310: 6f 70 6d 6f 73 74 20 63 68 61 6e 6e 65 6c 20 2a opmost channel *
5320: 2f 0a 20 20 20 20 63 68 61 6e 20 3d 20 54 63 6c /. chan = Tcl
5330: 5f 47 65 74 54 6f 70 43 68 61 6e 6e 65 6c 28 63 _GetTopChannel(c
5340: 68 61 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 72 han);.. /* Cr
5350: 65 61 74 65 20 73 74 72 75 63 74 20 2a 2f 0a 20 eate struct */.
5360: 20 20 20 69 66 20 28 28 73 74 61 74 65 50 74 72 if ((statePtr
5370: 20 3d 20 54 6c 73 5f 44 69 67 65 73 74 4e 65 77 = Tls_DigestNew
5380: 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61 74 29 (interp, format)
5390: 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 ) == NULL) {..Tc
53a0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 l_AppendResult(i
53b0: 6e 74 65 72 70 2c 20 22 49 6e 69 74 69 61 6c 69 nterp, "Initiali
53c0: 7a 65 20 64 69 67 65 73 74 20 65 72 72 6f 72 3a ze digest error:
53d0: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 memory allocati
53e0: 6f 6e 20 66 61 69 6c 75 72 65 22 2c 20 28 63 68 on failure", (ch
53f0: 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 ar *) NULL);..re
5400: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
5410: 20 20 20 20 7d 0a 20 20 20 20 73 74 61 74 65 50 }. stateP
5420: 74 72 2d 3e 73 65 6c 66 20 3d 20 63 68 61 6e 3b tr->self = chan;
5430: 0a 20 20 20 20 73 74 61 74 65 50 74 72 2d 3e 6d . statePtr->m
5440: 6f 64 65 20 3d 20 6d 6f 64 65 3b 0a 0a 20 20 20 ode = mode;..
5450: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 68 /* Initialize h
5460: 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a ash function */.
5470: 20 20 20 20 69 66 20 28 54 6c 73 5f 44 69 67 65 if (Tls_Dige
5480: 73 74 49 6e 69 74 28 69 6e 74 65 72 70 2c 20 73 stInit(interp, s
5490: 74 61 74 65 50 74 72 2c 20 6d 64 2c 20 6b 65 79 tatePtr, md, key
54a0: 4f 62 6a 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 Obj) != TCL_OK)
54b0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
54c0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
54d0: 2f 2a 20 43 6f 6e 66 69 67 75 72 65 20 63 68 61 /* Configure cha
54e0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 54 63 6c 5f nnel */. Tcl_
54f0: 53 65 74 43 68 61 6e 6e 65 6c 4f 70 74 69 6f 6e SetChannelOption
5500: 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 2c 20 22 (interp, chan, "
5510: 2d 74 72 61 6e 73 6c 61 74 69 6f 6e 22 2c 20 22 -translation", "
5520: 62 69 6e 61 72 79 22 29 3b 0a 20 20 20 20 69 66 binary");. if
5530: 20 28 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c (Tcl_GetChannel
5540: 42 75 66 66 65 72 53 69 7a 65 28 63 68 61 6e 29 BufferSize(chan)
5550: 20 3c 20 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 49 < EVP_MAX_MD_SI
5560: 5a 45 20 2a 20 32 29 20 7b 0a 09 54 63 6c 5f 53 ZE * 2) {..Tcl_S
5570: 65 74 43 68 61 6e 6e 65 6c 42 75 66 66 65 72 53 etChannelBufferS
5580: 69 7a 65 28 63 68 61 6e 2c 20 45 56 50 5f 4d 41 ize(chan, EVP_MA
5590: 58 5f 4d 44 5f 53 49 5a 45 20 2a 20 32 29 3b 0a X_MD_SIZE * 2);.
55a0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 74 }.. /* St
55b0: 61 63 6b 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 ack channel */.
55c0: 20 20 20 73 74 61 74 65 50 74 72 2d 3e 73 65 6c statePtr->sel
55d0: 66 20 3d 20 54 63 6c 5f 53 74 61 63 6b 43 68 61 f = Tcl_StackCha
55e0: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 26 64 69 nnel(interp, &di
55f0: 67 65 73 74 43 68 61 6e 6e 65 6c 54 79 70 65 2c gestChannelType,
5600: 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 73 74 (ClientData) st
5610: 61 74 65 50 74 72 2c 20 6d 6f 64 65 2c 20 63 68 atePtr, mode, ch
5620: 61 6e 29 3b 0a 20 20 20 20 69 66 20 28 73 74 61 an);. if (sta
5630: 74 65 50 74 72 2d 3e 73 65 6c 66 20 3d 3d 20 28 tePtr->self == (
5640: 54 63 6c 5f 43 68 61 6e 6e 65 6c 29 20 4e 55 4c Tcl_Channel) NUL
5650: 4c 29 20 7b 0a 09 54 6c 73 5f 44 69 67 65 73 74 L) {..Tls_Digest
5660: 46 72 65 65 28 73 74 61 74 65 50 74 72 29 3b 0a Free(statePtr);.
5670: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
5680: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 R;. }.. Tc
5690: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 l_SetResult(inte
56a0: 72 70 2c 20 28 63 68 61 72 20 2a 29 20 54 63 6c rp, (char *) Tcl
56b0: 5f 47 65 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 _GetChannelName(
56c0: 63 68 61 6e 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 chan), TCL_VOLAT
56d0: 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e ILE);. return
56e0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 TCL_OK;.}../*.
56f0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
5700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5730: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 6e -------. *. * Un
5740: 73 74 61 63 6b 20 43 68 61 6e 6e 65 6c 20 2d 2d stack Channel --
5750: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 . *. *.This func
5760: 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 tion is invoked
5770: 74 6f 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 to process the "
5780: 75 6e 73 74 61 63 6b 22 20 54 43 4c 20 63 6f 6d unstack" TCL com
5790: 6d 61 6e 64 2e 0a 20 2a 09 53 65 65 20 74 68 65 mand.. *.See the
57a0: 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 74 user documentat
57b0: 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73 20 ion for details
57c0: 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 73 2e on what it does.
57d0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a . *. * Returns:.
57e0: 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c *.TCL_OK or TCL
57f0: 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 _ERROR. *. * Sid
5800: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 52 65 e effects:. *.Re
5810: 6d 6f 76 65 73 20 74 72 61 6e 73 66 6f 72 6d 20 moves transform
5820: 66 72 6f 6d 20 63 68 61 6e 6e 65 6c 20 6f 72 20 from channel or
5830: 73 65 74 73 20 72 65 73 75 6c 74 20 74 6f 20 65 sets result to e
5840: 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 2a rror message.. *
5850: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
5860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 73 74 ---------. */.st
58a0: 61 74 69 63 20 69 6e 74 0a 55 6e 73 74 61 63 6b atic int.Unstack
58b0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
58c0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
58d0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
58e0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
58f0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
5900: 5d 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 68 61 ]) {. Tcl_Cha
5910: 6e 6e 65 6c 20 63 68 61 6e 3b 0a 20 20 20 20 69 nnel chan;. i
5920: 6e 74 20 6d 6f 64 65 3b 20 2f 2a 20 4f 52 2d 65 nt mode; /* OR-e
5930: 64 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 d combination of
5940: 20 54 43 4c 5f 52 45 41 44 41 42 4c 45 20 61 6e TCL_READABLE an
5950: 64 20 54 43 4c 5f 57 52 49 54 41 42 4c 45 20 20 d TCL_WRITABLE
5960: 2a 2f 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 */.. if (objc
5970: 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 != 2) {..Tcl_Wr
5980: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
5990: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 63 68 61 p, 1, objv, "cha
59a0: 6e 6e 65 6c 22 29 3b 0a 09 72 65 74 75 72 6e 20 nnel");..return
59b0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
59c0: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 63 68 61 .. /* Get cha
59d0: 6e 6e 65 6c 20 2a 2f 0a 20 20 20 20 63 68 61 6e nnel */. chan
59e0: 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 = Tcl_GetChanne
59f0: 6c 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 l(interp, Tcl_Ge
5a00: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f tStringFromObj(o
5a10: 62 6a 76 5b 31 5d 2c 20 4e 55 4c 4c 29 2c 20 26 bjv[1], NULL), &
5a20: 6d 6f 64 65 29 3b 0a 20 20 20 20 69 66 20 28 63 mode);. if (c
5a30: 68 61 6e 20 3d 3d 20 28 54 63 6c 5f 43 68 61 6e han == (Tcl_Chan
5a40: 6e 65 6c 29 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 nel) NULL) {..re
5a50: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
5a60: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4d 61 }.. /* Ma
5a70: 6b 65 20 73 75 72 65 20 74 6f 20 6f 70 65 72 61 ke sure to opera
5a80: 74 65 20 6f 6e 20 74 68 65 20 74 6f 70 6d 6f 73 te on the topmos
5a90: 74 20 63 68 61 6e 6e 65 6c 20 2a 2f 0a 20 20 20 t channel */.
5aa0: 20 63 68 61 6e 20 3d 20 54 63 6c 5f 47 65 74 54 chan = Tcl_GetT
5ab0: 6f 70 43 68 61 6e 6e 65 6c 28 63 68 61 6e 29 3b opChannel(chan);
5ac0: 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 .. /* Check i
5ad0: 66 20 64 69 67 65 73 74 20 63 68 61 6e 6e 65 6c f digest channel
5ae0: 20 2a 2f 0a 20 20 20 20 69 66 20 28 54 63 6c 5f */. if (Tcl_
5af0: 47 65 74 43 68 61 6e 6e 65 6c 54 79 70 65 28 63 GetChannelType(c
5b00: 68 61 6e 29 20 21 3d 20 26 64 69 67 65 73 74 43 han) != &digestC
5b10: 68 61 6e 6e 65 6c 54 79 70 65 29 20 7b 0a 09 54 hannelType) {..T
5b20: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
5b30: 69 6e 74 65 72 70 2c 20 22 62 61 64 20 63 68 61 interp, "bad cha
5b40: 6e 6e 65 6c 20 5c 22 22 2c 20 54 63 6c 5f 47 65 nnel \"", Tcl_Ge
5b50: 74 43 68 61 6e 6e 65 6c 4e 61 6d 65 28 63 68 61 tChannelName(cha
5b60: 6e 29 2c 0a 09 20 20 20 20 22 5c 22 3a 20 6e 6f n),.. "\": no
5b70: 74 20 61 20 64 69 67 65 73 74 20 63 68 61 6e 6e t a digest chann
5b80: 65 6c 22 2c 20 4e 55 4c 4c 29 3b 0a 09 54 63 6c el", NULL);..Tcl
5b90: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
5ba0: 74 65 72 70 2c 20 22 54 4c 53 22 2c 20 22 55 4e terp, "TLS", "UN
5bb0: 53 54 41 43 4b 22 2c 20 22 43 48 41 4e 4e 45 4c STACK", "CHANNEL
5bc0: 22 2c 20 22 49 4e 56 41 4c 49 44 22 2c 20 28 63 ", "INVALID", (c
5bd0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 har *) NULL);..r
5be0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
5bf0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 . }.. /* P
5c00: 6f 70 20 74 72 61 6e 73 66 6f 72 6d 20 66 72 6f op transform fro
5c10: 6d 20 63 68 61 6e 6e 65 6c 2c 20 6c 65 61 76 65 m channel, leave
5c20: 73 20 65 72 72 6f 72 20 69 6e 66 6f 20 69 6e 20 s error info in
5c30: 69 6e 74 65 72 70 20 72 65 73 75 6c 74 20 2a 2f interp result */
5c40: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 55 6e 73 . if (Tcl_Uns
5c50: 74 61 63 6b 43 68 61 6e 6e 65 6c 28 69 6e 74 65 tackChannel(inte
5c60: 72 70 2c 20 63 68 61 6e 29 20 3d 3d 20 54 43 4c rp, chan) == TCL
5c70: 5f 45 52 52 4f 52 29 20 7b 0a 09 72 65 74 75 72 _ERROR) {..retur
5c80: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
5c90: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 }. return TC
5ca0: 4c 5f 4f 4b 3b 0a 20 20 20 20 09 63 6c 69 65 6e L_OK;. .clien
5cb0: 74 44 61 74 61 20 3d 20 63 6c 69 65 6e 74 44 61 tData = clientDa
5cc0: 74 61 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a ta;.}../********
5cd0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5ce0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5cf0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
5d00: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 73 74 ***********/..st
5d10: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 atic const char
5d20: 2a 69 6e 73 74 61 6e 63 65 5f 66 6e 73 20 5b 5d *instance_fns []
5d30: 20 3d 20 7b 20 22 66 69 6e 61 6c 69 7a 65 22 2c = { "finalize",
5d40: 20 22 75 70 64 61 74 65 22 2c 20 4e 55 4c 4c 20 "update", NULL
5d50: 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d };../*. *-------
5d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
5da0: 20 2a 20 49 6e 73 74 61 6e 63 65 4f 62 6a 43 6d * InstanceObjCm
5db0: 64 20 2d 2d 0a 20 2a 0a 20 2a 09 20 48 61 6e 64 d --. *. *. Hand
5dc0: 6c 65 72 20 66 6f 72 20 64 69 67 65 73 74 20 61 ler for digest a
5dd0: 63 63 75 6d 75 6c 61 74 6f 72 20 63 6f 6d 6d 61 ccumulator comma
5de0: 6e 64 20 69 6e 73 74 61 6e 63 65 73 2e 0a 20 2a nd instances.. *
5df0: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 . * Returns:. *.
5e00: 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 TCL_OK or TCL_ER
5e10: 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ROR. *. * Side e
5e20: 66 66 65 63 74 73 3a 0a 20 2a 09 41 64 64 73 20 ffects:. *.Adds
5e30: 64 61 74 61 20 74 6f 20 68 61 73 68 20 6f 72 20 data to hash or
5e40: 72 65 74 75 72 6e 73 20 6d 65 73 73 61 67 65 20 returns message
5e50: 64 69 67 65 73 74 0a 20 2a 0a 20 2a 2d 2d 2d 2d digest. *. *----
5e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5e70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5e80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
5ea0: 20 2a 2f 0a 69 6e 74 20 49 6e 73 74 61 6e 63 65 */.int Instance
5eb0: 4f 62 6a 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 ObjCmd(ClientDat
5ec0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
5ed0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
5ee0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
5ef0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
5f00: 5d 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 ]) {. DigestS
5f10: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 20 3d tate *statePtr =
5f20: 20 28 44 69 67 65 73 74 53 74 61 74 65 20 2a 29 (DigestState *)
5f30: 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 clientData;.
5f40: 20 69 6e 74 20 66 6e 2c 20 6c 65 6e 20 3d 20 30 int fn, len = 0
5f50: 3b 0a 20 20 20 20 63 68 61 72 20 2a 62 75 66 20 ;. char *buf
5f60: 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 69 66 20 = NULL;.. if
5f70: 28 6f 62 6a 63 20 3c 20 32 20 7c 7c 20 6f 62 6a (objc < 2 || obj
5f80: 63 20 3e 20 33 29 20 7b 0a 09 54 63 6c 5f 57 72 c > 3) {..Tcl_Wr
5f90: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
5fa0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 66 75 6e p, 1, objv, "fun
5fb0: 63 74 69 6f 6e 20 3f 64 61 74 61 3f 22 29 3b 0a ction ?data?");.
5fc0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
5fd0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
5fe0: 20 46 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 Function */.
5ff0: 20 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65 if (Tcl_GetInde
6000: 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c xFromObj(interp,
6010: 20 6f 62 6a 76 5b 31 5d 2c 20 69 6e 73 74 61 6e objv[1], instan
6020: 63 65 5f 66 6e 73 2c 20 22 66 75 6e 63 74 69 6f ce_fns, "functio
6030: 6e 22 2c 20 30 2c 20 26 66 6e 29 20 21 3d 20 54 n", 0, &fn) != T
6040: 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e CL_OK) {..return
6050: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
6060: 7d 0a 0a 20 20 20 20 2f 2a 20 44 6f 20 66 75 6e }.. /* Do fun
6070: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 69 66 20 ction */. if
6080: 28 66 6e 29 20 7b 0a 09 2f 2a 20 55 70 64 61 74 (fn) {../* Updat
6090: 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 e hash function
60a0: 2a 2f 0a 09 69 66 20 28 6f 62 6a 63 20 3d 3d 20 */..if (objc ==
60b0: 33 29 20 7b 0a 09 20 20 20 20 62 75 66 20 3d 20 3) {.. buf =
60c0: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 Tcl_GetByteArray
60d0: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c FromObj(objv[2],
60e0: 20 26 6c 65 6e 29 3b 0a 09 7d 20 65 6c 73 65 20 &len);..} else
60f0: 7b 0a 09 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 {.. Tcl_Wrong
6100: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
6110: 31 2c 20 6f 62 6a 76 2c 20 22 75 70 64 61 74 65 1, objv, "update
6120: 20 64 61 74 61 22 29 3b 0a 09 20 20 20 20 72 65 data");.. re
6130: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
6140: 09 7d 0a 0a 09 69 66 20 28 21 54 6c 73 5f 44 69 .}...if (!Tls_Di
6150: 67 65 73 74 55 70 64 61 74 65 28 73 74 61 74 65 gestUpdate(state
6160: 50 74 72 2c 20 62 75 66 2c 20 28 73 69 7a 65 5f Ptr, buf, (size_
6170: 74 29 20 6c 65 6e 29 29 20 7b 0a 09 20 20 20 20 t) len)) {..
6180: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
6190: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a (interp, Tcl_Obj
61a0: 50 72 69 6e 74 66 28 22 44 69 67 65 73 74 20 75 Printf("Digest u
61b0: 70 64 61 74 65 20 66 61 69 6c 65 64 3a 20 25 73 pdate failed: %s
61c0: 22 2c 20 52 45 41 53 4f 4e 28 29 29 29 3b 0a 09 ", REASON()));..
61d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 return TCL_E
61e0: 52 52 4f 52 3b 0a 09 7d 0a 0a 20 20 20 20 7d 20 RROR;..}.. }
61f0: 65 6c 73 65 20 7b 0a 09 2f 2a 20 46 69 6e 61 6c else {../* Final
6200: 69 7a 65 20 68 61 73 68 20 66 75 6e 63 74 69 6f ize hash functio
6210: 6e 20 61 6e 64 20 63 61 6c 63 75 6c 61 74 65 20 n and calculate
6220: 6d 65 73 73 61 67 65 20 64 69 67 65 73 74 20 2a message digest *
6230: 2f 0a 09 69 66 20 28 54 6c 73 5f 44 69 67 65 73 /..if (Tls_Diges
6240: 74 46 69 6e 69 61 6c 69 7a 65 28 69 6e 74 65 72 tFinialize(inter
6250: 70 2c 20 73 74 61 74 65 50 74 72 29 20 21 3d 20 p, statePtr) !=
6260: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 54 TCL_OK) {.. T
6270: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
6280: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 interp, Tcl_ObjP
6290: 72 69 6e 74 66 28 22 44 69 67 65 73 74 20 66 69 rintf("Digest fi
62a0: 6e 61 6c 69 7a 65 20 66 61 69 6c 65 64 3a 20 25 nalize failed: %
62b0: 73 22 2c 20 52 45 41 53 4f 4e 28 29 29 29 3b 0a s", REASON()));.
62c0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
62d0: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 54 63 6c 5f ERROR;..}...Tcl_
62e0: 44 65 6c 65 74 65 43 6f 6d 6d 61 6e 64 46 72 6f DeleteCommandFro
62f0: 6d 54 6f 6b 65 6e 28 69 6e 74 65 72 70 2c 20 73 mToken(interp, s
6300: 74 61 74 65 50 74 72 2d 3e 74 6f 6b 65 6e 29 3b tatePtr->token);
6310: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
6320: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a n TCL_OK;.}../*.
6330: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
6340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6370: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 73 74 -----. *. * Inst
6380: 61 6e 63 65 44 65 6c 43 61 6c 6c 62 61 63 6b 20 anceDelCallback
6390: 2d 2d 0a 20 2a 0a 20 2a 09 20 43 61 6c 6c 62 61 --. *. *. Callba
63a0: 63 6b 20 74 6f 20 63 6c 65 61 6e 2d 75 70 20 77 ck to clean-up w
63b0: 68 65 6e 20 64 69 67 65 73 74 20 69 6e 73 74 61 hen digest insta
63c0: 6e 63 65 20 63 6f 6d 6d 61 6e 64 20 69 73 20 64 nce command is d
63d0: 65 6c 65 74 65 64 2e 0a 20 2a 0a 20 2a 20 52 65 eleted.. *. * Re
63e0: 74 75 72 6e 73 3a 0a 20 2a 09 4e 6f 74 68 69 6e turns:. *.Nothin
63f0: 67 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 g. *. * Side eff
6400: 65 63 74 73 3a 0a 20 2a 09 44 65 73 74 72 6f 79 ects:. *.Destroy
6410: 73 20 73 74 72 75 63 74 0a 20 2a 0a 20 2a 2d 2d s struct. *. *--
6420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6460: 2d 0a 20 2a 2f 0a 76 6f 69 64 20 49 6e 73 74 61 -. */.void Insta
6470: 6e 63 65 44 65 6c 43 61 6c 6c 62 61 63 6b 28 43 nceDelCallback(C
6480: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
6490: 44 61 74 61 29 20 7b 0a 20 20 20 20 44 69 67 65 Data) {. Dige
64a0: 73 74 53 74 61 74 65 20 2a 73 74 61 74 65 50 74 stState *statePt
64b0: 72 20 3d 20 28 44 69 67 65 73 74 53 74 61 74 65 r = (DigestState
64c0: 20 2a 29 20 63 6c 69 65 6e 74 44 61 74 61 3b 0a *) clientData;.
64d0: 0a 20 20 20 20 2f 2a 20 43 6c 65 61 6e 2d 75 70 . /* Clean-up
64e0: 20 2a 2f 0a 20 20 20 20 54 6c 73 5f 44 69 67 65 */. Tls_Dige
64f0: 73 74 46 72 65 65 28 73 74 61 74 65 50 74 72 29 stFree(statePtr)
6500: 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
6550: 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73 74 49 6e . * Tls_DigestIn
6560: 73 74 61 6e 63 65 20 2d 2d 0a 20 2a 0a 20 2a 09 stance --. *. *.
6570: 20 43 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 Create command
6580: 74 6f 20 61 6c 6c 6f 77 20 75 73 65 72 20 74 6f to allow user to
6590: 20 61 64 64 20 64 61 74 61 20 74 6f 20 68 61 73 add data to has
65a0: 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 h function.. *.
65b0: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 * Returns:. *.TC
65c0: 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f L_OK or TCL_ERRO
65d0: 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 R. *. * Side eff
65e0: 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 73 ects:. *.Creates
65f0: 20 63 6f 6d 6d 61 6e 64 20 6f 72 20 65 72 72 6f command or erro
6600: 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d r message. *. *-
6610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6650: 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f 44 --. */.int Tls_D
6660: 69 67 65 73 74 49 6e 73 74 61 6e 63 65 28 54 63 igestInstance(Tc
6670: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
6680: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 4f 62 , Tcl_Obj *cmdOb
6690: 6a 2c 20 63 6f 6e 73 74 20 45 56 50 5f 4d 44 20 j, const EVP_MD
66a0: 2a 6d 64 2c 20 69 6e 74 20 66 6f 72 6d 61 74 2c *md, int format,
66b0: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 ..Tcl_Obj *keyOb
66c0: 6a 29 20 7b 0a 20 20 20 20 44 69 67 65 73 74 53 j) {. DigestS
66d0: 74 61 74 65 20 2a 73 74 61 74 65 50 74 72 3b 0a tate *statePtr;.
66e0: 20 20 20 20 63 68 61 72 20 2a 63 6d 64 4e 61 6d char *cmdNam
66f0: 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e e = Tcl_GetStrin
6700: 67 46 72 6f 6d 4f 62 6a 28 63 6d 64 4f 62 6a 2c gFromObj(cmdObj,
6710: 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 2f 2a 20 NULL);.. /*
6720: 43 72 65 61 74 65 20 73 74 72 75 63 74 20 2a 2f Create struct */
6730: 0a 20 20 20 20 69 66 20 28 28 73 74 61 74 65 50 . if ((stateP
6740: 74 72 20 3d 20 54 6c 73 5f 44 69 67 65 73 74 4e tr = Tls_DigestN
6750: 65 77 28 69 6e 74 65 72 70 2c 20 66 6f 72 6d 61 ew(interp, forma
6760: 74 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 t)) == NULL) {..
6770: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
6780: 28 69 6e 74 65 72 70 2c 20 22 49 6e 69 74 69 61 (interp, "Initia
6790: 6c 69 7a 65 20 64 69 67 65 73 74 20 65 72 72 6f lize digest erro
67a0: 72 3a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 r: memory alloca
67b0: 74 69 6f 6e 20 66 61 69 6c 75 72 65 22 2c 20 28 tion failure", (
67c0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
67d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
67e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
67f0: 49 6e 69 74 69 61 6c 69 7a 65 20 68 61 73 68 20 Initialize hash
6800: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 function */.
6810: 69 66 20 28 54 6c 73 5f 44 69 67 65 73 74 49 6e if (Tls_DigestIn
6820: 69 74 28 69 6e 74 65 72 70 2c 20 73 74 61 74 65 it(interp, state
6830: 50 74 72 2c 20 6d 64 2c 20 6b 65 79 4f 62 6a 29 Ptr, md, keyObj)
6840: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
6850: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
6860: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 . }.. /* C
6870: 72 65 61 74 65 20 69 6e 73 74 61 6e 63 65 20 63 reate instance c
6880: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 20 20 73 74 ommand */. st
6890: 61 74 65 50 74 72 2d 3e 74 6f 6b 65 6e 20 3d 20 atePtr->token =
68a0: 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d Tcl_CreateObjCom
68b0: 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 63 6d 64 mand(interp, cmd
68c0: 4e 61 6d 65 2c 20 49 6e 73 74 61 6e 63 65 4f 62 Name, InstanceOb
68d0: 6a 43 6d 64 2c 0a 09 28 43 6c 69 65 6e 74 44 61 jCmd,..(ClientDa
68e0: 74 61 29 20 73 74 61 74 65 50 74 72 2c 20 49 6e ta) statePtr, In
68f0: 73 74 61 6e 63 65 44 65 6c 43 61 6c 6c 62 61 63 stanceDelCallbac
6900: 6b 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 74 75 k);.. /* Retu
6910: 72 6e 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 rn command name
6920: 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 */. Tcl_SetOb
6930: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
6940: 63 6d 64 4f 62 6a 29 3b 0a 20 20 20 20 72 65 74 cmdObj);. ret
6950: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a urn TCL_OK;.}...
6960: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a /***************
6970: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6980: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
6990: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
69a0: 2a 2a 2a 2a 2f 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d ****/../*. *----
69b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
69c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
69d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
69e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
69f0: 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 67 65 73 74 *. * Tls_Digest
6a00: 44 61 74 61 20 2d 2d 0a 20 2a 0a 20 2a 09 20 43 Data --. *. *. C
6a10: 61 6c 63 75 6c 61 74 65 20 6d 65 73 73 61 67 65 alculate message
6a20: 20 64 69 67 65 73 74 20 75 73 69 6e 67 20 68 61 digest using ha
6a30: 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a sh function.. *.
6a40: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 * Returns:. *.T
6a50: 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 CL_OK or TCL_ERR
6a60: 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 OR. *. * Side ef
6a70: 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 fects:. *.Sets r
6a80: 65 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 67 65 esult to message
6a90: 20 64 69 67 65 73 74 20 6f 72 20 65 72 72 6f 72 digest or error
6aa0: 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d message. *. *--
6ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6af0: 2d 0a 20 2a 2f 0a 69 6e 74 0a 54 6c 73 5f 44 69 -. */.int.Tls_Di
6b00: 67 65 73 74 44 61 74 61 28 54 63 6c 5f 49 6e 74 gestData(Tcl_Int
6b10: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 erp *interp, int
6b20: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
6b30: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 2c 0a 09 63 const objv[],..c
6b40: 6f 6e 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 2c onst EVP_MD *md,
6b50: 20 69 6e 74 20 66 6f 72 6d 61 74 2c 20 54 63 6c int format, Tcl
6b60: 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a 29 20 7b 0a _Obj *keyObj) {.
6b70: 20 20 20 20 63 68 61 72 20 2a 64 61 74 61 3b 0a char *data;.
6b80: 20 20 20 20 69 6e 74 20 6c 65 6e 2c 20 72 65 73 int len, res
6b90: 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 ;. unsigned i
6ba0: 6e 74 20 6d 64 5f 6c 65 6e 3b 0a 20 20 20 20 75 nt md_len;. u
6bb0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 6d 64 5f nsigned char md_
6bc0: 62 75 66 5b 45 56 50 5f 4d 41 58 5f 4d 44 5f 53 buf[EVP_MAX_MD_S
6bd0: 49 5a 45 5d 3b 0a 0a 20 20 20 20 69 66 20 28 6f IZE];.. if (o
6be0: 62 6a 63 20 21 3d 20 32 29 20 7b 0a 09 54 63 6c bjc != 2) {..Tcl
6bf0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
6c00: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
6c10: 64 61 74 61 22 29 3b 0a 09 72 65 74 75 72 6e 20 data");..return
6c20: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
6c30: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 64 61 74 .. /* Get dat
6c40: 61 20 2a 2f 0a 20 20 20 20 64 61 74 61 20 3d 20 a */. data =
6c50: 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 Tcl_GetByteArray
6c60: 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c FromObj(objv[1],
6c70: 20 26 6c 65 6e 29 3b 0a 20 20 20 20 69 66 20 28 &len);. if (
6c80: 64 61 74 61 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 data == NULL ||
6c90: 6c 65 6e 20 3d 3d 20 30 29 20 7b 0a 09 54 63 6c len == 0) {..Tcl
6ca0: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 _SetResult(inter
6cb0: 70 2c 20 22 4e 6f 20 64 61 74 61 22 2c 20 4e 55 p, "No data", NU
6cc0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
6cd0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
6ce0: 20 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 /* Calculate
6cf0: 64 69 67 65 73 74 20 62 61 73 65 64 20 6f 6e 20 digest based on
6d00: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 20 2a 2f hash function */
6d10: 0a 20 20 20 20 69 66 20 28 6b 65 79 4f 62 6a 20 . if (keyObj
6d20: 3d 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 29 20 4e == (Tcl_Obj *) N
6d30: 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d 20 45 56 ULL) {..res = EV
6d40: 50 5f 44 69 67 65 73 74 28 64 61 74 61 2c 20 28 P_Digest(data, (
6d50: 73 69 7a 65 5f 74 29 20 6c 65 6e 2c 20 6d 64 5f size_t) len, md_
6d60: 62 75 66 2c 20 26 6d 64 5f 6c 65 6e 2c 20 6d 64 buf, &md_len, md
6d70: 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 7d 20 65 , NULL);. } e
6d80: 6c 73 65 20 7b 0a 09 75 6e 73 69 67 6e 65 64 20 lse {..unsigned
6d90: 63 68 61 72 20 2a 6b 65 79 2c 20 2a 68 6d 61 63 char *key, *hmac
6da0: 20 3d 20 4e 55 4c 4c 3b 0a 09 69 6e 74 20 6b 65 = NULL;..int ke
6db0: 79 5f 6c 65 6e 3b 0a 0a 09 6b 65 79 20 3d 20 54 y_len;...key = T
6dc0: 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 cl_GetByteArrayF
6dd0: 72 6f 6d 4f 62 6a 28 6b 65 79 4f 62 6a 2c 20 26 romObj(keyObj, &
6de0: 6b 65 79 5f 6c 65 6e 29 3b 0a 09 68 6d 61 63 20 key_len);..hmac
6df0: 3d 20 48 4d 41 43 28 6d 64 2c 20 28 63 6f 6e 73 = HMAC(md, (cons
6e00: 74 20 76 6f 69 64 20 2a 29 20 6b 65 79 2c 20 6b t void *) key, k
6e10: 65 79 5f 6c 65 6e 2c 20 28 63 6f 6e 73 74 20 75 ey_len, (const u
6e20: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 20 nsigned char *)
6e30: 64 61 74 61 2c 0a 09 20 20 20 20 28 73 69 7a 65 data,.. (size
6e40: 5f 74 29 20 6c 65 6e 2c 20 6d 64 5f 62 75 66 2c _t) len, md_buf,
6e50: 20 26 6d 64 5f 6c 65 6e 29 3b 0a 09 72 65 73 20 &md_len);..res
6e60: 3d 20 28 68 6d 61 63 20 21 3d 20 4e 55 4c 4c 29 = (hmac != NULL)
6e70: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 ;. }.. /*
6e80: 4f 75 74 70 75 74 20 64 69 67 65 73 74 20 74 6f Output digest to
6e90: 20 72 65 73 75 6c 74 20 70 65 72 20 66 6f 72 6d result per form
6ea0: 61 74 20 28 62 69 6e 20 6f 72 20 68 65 78 29 20 at (bin or hex)
6eb0: 2a 2f 0a 20 20 20 20 69 66 20 28 72 65 73 29 20 */. if (res)
6ec0: 7b 0a 09 69 66 20 28 66 6f 72 6d 61 74 20 3d 3d {..if (format ==
6ed0: 20 42 49 4e 5f 46 4f 52 4d 41 54 29 20 7b 0a 09 BIN_FORMAT) {..
6ee0: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 Tcl_SetObjRe
6ef0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
6f00: 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a _NewByteArrayObj
6f10: 28 6d 64 5f 62 75 66 2c 20 6d 64 5f 6c 65 6e 29 (md_buf, md_len)
6f20: 29 3b 0a 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 );...} else {..
6f30: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 Tcl_Obj *resu
6f40: 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f ltObj = Tcl_NewO
6f50: 62 6a 28 29 3b 0a 09 20 20 20 20 75 6e 73 69 67 bj();.. unsig
6f60: 6e 65 64 20 63 68 61 72 20 2a 70 74 72 20 3d 20 ned char *ptr =
6f70: 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79 Tcl_SetByteArray
6f80: 4c 65 6e 67 74 68 28 72 65 73 75 6c 74 4f 62 6a Length(resultObj
6f90: 2c 20 6d 64 5f 6c 65 6e 2a 32 29 3b 0a 0a 09 20 , md_len*2);...
6fa0: 20 20 20 66 6f 72 20 28 75 6e 73 69 67 6e 65 64 for (unsigned
6fb0: 20 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20 int i = 0; i <
6fc0: 6d 64 5f 6c 65 6e 3b 20 69 2b 2b 29 20 7b 0a 09 md_len; i++) {..
6fd0: 09 2a 70 74 72 2b 2b 20 3d 20 68 65 78 5b 28 6d .*ptr++ = hex[(m
6fe0: 64 5f 62 75 66 5b 69 5d 20 3e 3e 20 34 29 20 26 d_buf[i] >> 4) &
6ff0: 20 30 78 30 46 5d 3b 0a 09 09 2a 70 74 72 2b 2b 0x0F];...*ptr++
7000: 20 3d 20 68 65 78 5b 6d 64 5f 62 75 66 5b 69 5d = hex[md_buf[i]
7010: 20 26 20 30 78 30 46 5d 3b 0a 09 20 20 20 20 7d & 0x0F];.. }
7020: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 ..Tcl_SetObjResu
7030: 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c lt(interp, resul
7040: 74 4f 62 6a 29 3b 0a 09 7d 0a 0a 20 20 20 20 7d tObj);..}.. }
7050: 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 41 70 70 else {..Tcl_App
7060: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
7070: 2c 20 22 48 61 73 68 20 63 61 6c 63 75 6c 61 74 , "Hash calculat
7080: 69 6f 6e 20 65 72 72 6f 72 3a 22 2c 20 52 45 41 ion error:", REA
7090: 53 4f 4e 28 29 2c 20 28 63 68 61 72 20 2a 29 20 SON(), (char *)
70a0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
70b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
70c0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
70d0: 4b 3b 0a 7d 0a 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a K;.}.../********
70e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
70f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
7110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f 2a ***********/../*
7120: 0a 20 2a 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 2d 2d 2d 2d ----------------
7160: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 44 69 67 ------. *. * Dig
7170: 65 73 74 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a estObjCmd --. *.
7180: 20 2a 09 52 65 74 75 72 6e 20 6d 65 73 73 61 67 *.Return messag
7190: 65 20 64 69 67 65 73 74 20 75 73 69 6e 67 20 75 e digest using u
71a0: 73 65 72 20 73 70 65 63 69 66 69 65 64 20 68 61 ser specified ha
71b0: 73 68 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 2a 0a sh function.. *.
71c0: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 * Returns:. *.T
71d0: 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 CL_OK or TCL_ERR
71e0: 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 OR. *. * Side ef
71f0: 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 fects:. *.Sets r
7200: 65 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 67 65 esult to message
7210: 20 64 69 67 65 73 74 20 6f 72 20 65 72 72 6f 72 digest or error
7220: 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d message. *. *--
7230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7270: 2d 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 -. */.static int
7280: 0a 44 69 67 65 73 74 4f 62 6a 43 6d 64 28 43 6c .DigestObjCmd(Cl
7290: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
72a0: 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 ata, Tcl_Interp
72b0: 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a *interp, int obj
72c0: 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 c, Tcl_Obj *cons
72d0: 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 t objv[]) {.
72e0: 69 6e 74 20 69 64 78 2c 20 6c 65 6e 2c 20 66 6f int idx, len, fo
72f0: 72 6d 61 74 20 3d 20 48 45 58 5f 46 4f 52 4d 41 rmat = HEX_FORMA
7300: 54 2c 20 6b 65 79 5f 6c 65 6e 20 3d 20 30 2c 20 T, key_len = 0,
7310: 64 61 74 61 5f 6c 65 6e 20 3d 20 30 2c 20 72 65 data_len = 0, re
7320: 73 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 s = TCL_ERROR;.
7330: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 64 const char *d
7340: 69 67 65 73 74 6e 61 6d 65 2c 20 2a 63 68 61 6e igestname, *chan
7350: 6e 65 6c 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 nel = NULL;.
7360: 54 63 6c 5f 4f 62 6a 20 2a 63 6d 64 4f 62 6a 20 Tcl_Obj *cmdObj
7370: 3d 20 4e 55 4c 4c 2c 20 2a 64 61 74 61 4f 62 6a = NULL, *dataObj
7380: 20 3d 20 4e 55 4c 4c 2c 20 2a 66 69 6c 65 4f 62 = NULL, *fileOb
7390: 6a 20 3d 20 4e 55 4c 4c 2c 20 2a 6b 65 79 4f 62 j = NULL, *keyOb
73a0: 6a 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 75 6e j = NULL;. un
73b0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6b 65 79 signed char *key
73c0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e = NULL;. con
73d0: 73 74 20 45 56 50 5f 4d 44 20 2a 6d 64 3b 0a 0a st EVP_MD *md;..
73e0: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 Tcl_ResetRes
73f0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 0a 20 20 ult(interp);..
7400: 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 33 20 7c if (objc < 3 |
7410: 7c 20 6f 62 6a 63 20 3e 20 37 29 20 7b 0a 09 54 | objc > 7) {..T
7420: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 cl_WrongNumArgs(
7430: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c interp, 1, objv,
7440: 20 22 74 79 70 65 20 3f 2d 62 69 6e 7c 2d 68 65 "type ?-bin|-he
7450: 78 3f 20 3f 2d 6b 65 79 20 68 6d 61 63 5f 6b 65 x? ?-key hmac_ke
7460: 79 3f 20 5b 2d 63 68 61 6e 6e 65 6c 20 63 68 61 y? [-channel cha
7470: 6e 20 7c 20 2d 63 6f 6d 6d 61 6e 64 20 63 6d 64 n | -command cmd
7480: 4e 61 6d 65 20 7c 20 2d 66 69 6c 65 20 66 69 6c Name | -file fil
7490: 65 6e 61 6d 65 20 7c 20 3f 2d 64 61 74 61 3f 20 ename | ?-data?
74a0: 64 61 74 61 5d 22 29 3b 0a 09 72 65 74 75 72 6e data]");..return
74b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
74c0: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 64 69 }.. /* Get di
74d0: 67 65 73 74 20 2a 2f 0a 20 20 20 20 64 69 67 65 gest */. dige
74e0: 73 74 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 stname = Tcl_Get
74f0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 StringFromObj(ob
7500: 6a 76 5b 31 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 jv[1], &len);.
7510: 20 20 69 66 20 28 64 69 67 65 73 74 6e 61 6d 65 if (digestname
7520: 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 28 6d 64 20 == NULL || (md
7530: 3d 20 45 56 50 5f 67 65 74 5f 64 69 67 65 73 74 = EVP_get_digest
7540: 62 79 6e 61 6d 65 28 64 69 67 65 73 74 6e 61 6d byname(digestnam
7550: 65 29 29 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 e)) == NULL) {..
7560: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
7570: 28 69 6e 74 65 72 70 2c 20 22 49 6e 76 61 6c 69 (interp, "Invali
7580: 64 20 64 69 67 65 73 74 20 74 79 70 65 20 5c 22 d digest type \"
7590: 22 2c 20 64 69 67 65 73 74 6e 61 6d 65 2c 20 22 ", digestname, "
75a0: 5c 22 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 \"", NULL);..ret
75b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
75c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 74 }.. /* Opt
75d0: 69 6d 61 6c 20 63 61 73 65 20 66 6f 72 20 62 6c imal case for bl
75e0: 6f 62 20 6f 66 20 64 61 74 61 20 2a 2f 0a 20 20 ob of data */.
75f0: 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 33 29 if (objc == 3)
7600: 20 7b 0a 09 72 65 74 75 72 6e 20 54 6c 73 5f 44 {..return Tls_D
7610: 69 67 65 73 74 44 61 74 61 28 69 6e 74 65 72 70 igestData(interp
7620: 2c 20 2d 2d 6f 62 6a 63 2c 20 2b 2b 6f 62 6a 76 , --objc, ++objv
7630: 2c 20 6d 64 2c 20 66 6f 72 6d 61 74 2c 20 4e 55 , md, format, NU
7640: 4c 4c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 LL);. }..
7650: 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 73 20 2a /* Get options *
7660: 2f 0a 20 20 20 20 66 6f 72 20 28 69 64 78 20 3d /. for (idx =
7670: 20 32 3b 20 69 64 78 20 3c 20 6f 62 6a 63 2d 31 2; idx < objc-1
7680: 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 63 68 61 72 ; idx++) {..char
7690: 20 2a 6f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 *opt = Tcl_GetS
76a0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a tringFromObj(obj
76b0: 76 5b 69 64 78 5d 2c 20 4e 55 4c 4c 29 3b 0a 0a v[idx], NULL);..
76c0: 09 69 66 20 28 6f 70 74 5b 30 5d 20 21 3d 20 27 .if (opt[0] != '
76d0: 2d 27 29 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a -').. break;.
76e0: 0a 09 4f 50 54 46 4c 41 47 28 22 2d 62 69 6e 22 ..OPTFLAG("-bin"
76f0: 2c 20 66 6f 72 6d 61 74 2c 20 42 49 4e 5f 46 4f , format, BIN_FO
7700: 52 4d 41 54 29 3b 0a 09 4f 50 54 46 4c 41 47 28 RMAT);..OPTFLAG(
7710: 22 2d 62 69 6e 61 72 79 22 2c 20 66 6f 72 6d 61 "-binary", forma
7720: 74 2c 20 42 49 4e 5f 46 4f 52 4d 41 54 29 3b 0a t, BIN_FORMAT);.
7730: 09 4f 50 54 46 4c 41 47 28 22 2d 68 65 78 22 2c .OPTFLAG("-hex",
7740: 20 66 6f 72 6d 61 74 2c 20 48 45 58 5f 46 4f 52 format, HEX_FOR
7750: 4d 41 54 29 3b 0a 09 4f 50 54 46 4c 41 47 28 22 MAT);..OPTFLAG("
7760: 2d 68 65 78 61 64 65 63 69 6d 61 6c 22 2c 20 66 -hexadecimal", f
7770: 6f 72 6d 61 74 2c 20 48 45 58 5f 46 4f 52 4d 41 ormat, HEX_FORMA
7780: 54 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 64 61 T);..OPTOBJ("-da
7790: 74 61 22 2c 20 64 61 74 61 4f 62 6a 29 3b 0a 09 ta", dataObj);..
77a0: 4f 50 54 53 54 52 28 22 2d 63 68 61 6e 22 2c 20 OPTSTR("-chan",
77b0: 63 68 61 6e 6e 65 6c 29 3b 0a 09 4f 50 54 53 54 channel);..OPTST
77c0: 52 28 22 2d 63 68 61 6e 6e 65 6c 22 2c 20 63 68 R("-channel", ch
77d0: 61 6e 6e 65 6c 29 3b 0a 09 4f 50 54 4f 42 4a 28 annel);..OPTOBJ(
77e0: 22 2d 63 6f 6d 6d 61 6e 64 22 2c 20 63 6d 64 4f "-command", cmdO
77f0: 62 6a 29 3b 0a 09 4f 50 54 4f 42 4a 28 22 2d 66 bj);..OPTOBJ("-f
7800: 69 6c 65 22 2c 20 66 69 6c 65 4f 62 6a 29 3b 0a ile", fileObj);.
7810: 09 4f 50 54 4f 42 4a 28 22 2d 66 69 6c 65 6e 61 .OPTOBJ("-filena
7820: 6d 65 22 2c 20 66 69 6c 65 4f 62 6a 29 3b 0a 09 me", fileObj);..
7830: 4f 50 54 4f 42 4a 28 22 2d 6b 65 79 22 2c 20 6b OPTOBJ("-key", k
7840: 65 79 4f 62 6a 29 3b 0a 0a 09 4f 50 54 42 41 44 eyObj);...OPTBAD
7850: 28 22 6f 70 74 69 6f 6e 22 2c 20 22 2d 62 69 6e ("option", "-bin
7860: 2c 20 2d 63 68 61 6e 6e 65 6c 2c 20 2d 63 6f 6d , -channel, -com
7870: 6d 61 6e 64 2c 20 2d 64 61 74 61 2c 20 2d 66 69 mand, -data, -fi
7880: 6c 65 2c 20 2d 66 69 6c 65 6e 61 6d 65 2c 20 2d le, -filename, -
7890: 68 65 78 2c 20 6f 72 20 2d 6b 65 79 22 29 3b 0a hex, or -key");.
78a0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
78b0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
78c0: 20 49 66 20 6e 6f 20 6f 70 74 69 6f 6e 20 66 6f If no option fo
78d0: 72 20 6c 61 73 74 20 61 72 67 2c 20 74 68 65 6e r last arg, then
78e0: 20 69 74 73 20 74 68 65 20 64 61 74 61 20 2a 2f its the data */
78f0: 0a 20 20 20 20 69 66 20 28 69 64 78 20 3c 20 6f . if (idx < o
7900: 62 6a 63 29 20 7b 0a 09 64 61 74 61 4f 62 6a 20 bjc) {..dataObj
7910: 3d 20 6f 62 6a 76 5b 69 64 78 5d 3b 0a 20 20 20 = objv[idx];.
7920: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 63 20 }.. /* Calc
7930: 64 69 67 65 73 74 20 6f 6e 20 66 69 6c 65 2c 20 digest on file,
7940: 73 74 61 63 6b 65 64 20 63 68 61 6e 6e 65 6c 2c stacked channel,
7950: 20 6f 72 20 64 61 74 61 20 62 6c 6f 62 20 2a 2f or data blob */
7960: 0a 20 20 20 20 69 66 20 28 66 69 6c 65 4f 62 6a . if (fileObj
7970: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 != NULL) {..res
7980: 20 3d 20 54 6c 73 5f 44 69 67 65 73 74 46 69 6c = Tls_DigestFil
7990: 65 28 69 6e 74 65 72 70 2c 20 66 69 6c 65 4f 62 e(interp, fileOb
79a0: 6a 2c 20 6d 64 2c 20 66 6f 72 6d 61 74 2c 20 6b j, md, format, k
79b0: 65 79 4f 62 6a 29 3b 0a 20 20 20 20 7d 20 65 6c eyObj);. } el
79c0: 73 65 20 69 66 20 28 63 68 61 6e 6e 65 6c 20 21 se if (channel !
79d0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d = NULL) {..res =
79e0: 20 54 6c 73 5f 44 69 67 65 73 74 43 68 61 6e 6e Tls_DigestChann
79f0: 65 6c 28 69 6e 74 65 72 70 2c 20 63 68 61 6e 6e el(interp, chann
7a00: 65 6c 2c 20 6d 64 2c 20 66 6f 72 6d 61 74 2c 20 el, md, format,
7a10: 6b 65 79 4f 62 6a 29 3b 0a 20 20 20 20 7d 20 65 keyObj);. } e
7a20: 6c 73 65 20 69 66 20 28 63 6d 64 4f 62 6a 20 21 lse if (cmdObj !
7a30: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 73 20 3d = NULL) {..res =
7a40: 20 54 6c 73 5f 44 69 67 65 73 74 49 6e 73 74 61 Tls_DigestInsta
7a50: 6e 63 65 28 69 6e 74 65 72 70 2c 20 63 6d 64 4f nce(interp, cmdO
7a60: 62 6a 2c 20 6d 64 2c 20 66 6f 72 6d 61 74 2c 20 bj, md, format,
7a70: 6b 65 79 4f 62 6a 29 3b 0a 20 20 20 20 7d 20 65 keyObj);. } e
7a80: 6c 73 65 20 69 66 20 28 64 61 74 61 4f 62 6a 20 lse if (dataObj
7a90: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f != NULL) {..Tcl_
7aa0: 4f 62 6a 20 2a 6f 62 6a 73 5b 32 5d 3b 0a 09 6f Obj *objs[2];..o
7ab0: 62 6a 73 5b 30 5d 20 3d 20 4e 55 4c 4c 3b 0a 09 bjs[0] = NULL;..
7ac0: 6f 62 6a 73 5b 31 5d 20 3d 20 64 61 74 61 4f 62 objs[1] = dataOb
7ad0: 6a 3b 0a 09 72 65 73 20 3d 20 54 6c 73 5f 44 69 j;..res = Tls_Di
7ae0: 67 65 73 74 44 61 74 61 28 69 6e 74 65 72 70 2c gestData(interp,
7af0: 20 32 2c 20 6f 62 6a 73 2c 20 6d 64 2c 20 66 6f 2, objs, md, fo
7b00: 72 6d 61 74 2c 20 6b 65 79 4f 62 6a 29 3b 0a 20 rmat, keyObj);.
7b10: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 }. return
7b20: 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d res;.}../*. *---
7b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b70: 0a 20 2a 0a 20 2a 20 4d 65 73 73 61 67 65 20 44 . *. * Message D
7b80: 69 67 65 73 74 20 43 6f 6e 76 65 6e 69 65 6e 63 igest Convenienc
7b90: 65 20 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a 20 2a e Commands --. *
7ba0: 0a 20 2a 09 43 6f 6e 76 65 6e 69 65 6e 63 65 20 . *.Convenience
7bb0: 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 6d 65 73 commands for mes
7bc0: 73 61 67 65 20 64 69 67 65 73 74 73 2e 0a 20 2a sage digests.. *
7bd0: 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 . * Returns:. *.
7be0: 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 TCL_OK or TCL_ER
7bf0: 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 ROR. *. * Side e
7c00: 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 ffects:. *.Sets
7c10: 72 65 73 75 6c 74 20 74 6f 20 6d 65 73 73 61 67 result to messag
7c20: 65 20 64 69 67 65 73 74 20 6f 72 20 65 72 72 6f e digest or erro
7c30: 72 20 6d 65 73 73 61 67 65 0a 20 2a 0a 20 2a 2d r message. *. *-
7c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7c80: 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 44 69 67 65 73 --. */.int Diges
7c90: 74 4d 44 34 43 6d 64 28 43 6c 69 65 6e 74 44 61 tMD4Cmd(ClientDa
7ca0: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 ta clientData, T
7cb0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
7cc0: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c p, int objc, Tcl
7cd0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 _Obj *const objv
7ce0: 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e []) {. return
7cf0: 20 54 6c 73 5f 44 69 67 65 73 74 44 61 74 61 28 Tls_DigestData(
7d00: 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 interp, objc, ob
7d10: 6a 76 2c 20 45 56 50 5f 6d 64 34 28 29 2c 20 48 jv, EVP_md4(), H
7d20: 45 58 5f 46 4f 52 4d 41 54 2c 20 4e 55 4c 4c 29 EX_FORMAT, NULL)
7d30: 3b 0a 7d 0a 0a 69 6e 74 20 44 69 67 65 73 74 4d ;.}..int DigestM
7d40: 44 35 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 D5Cmd(ClientData
7d50: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c clientData, Tcl
7d60: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
7d70: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
7d80: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d bj *const objv[]
7d90: 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 ) {. return T
7da0: 6c 73 5f 44 69 67 65 73 74 44 61 74 61 28 69 6e ls_DigestData(in
7db0: 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 terp, objc, objv
7dc0: 2c 20 45 56 50 5f 6d 64 35 28 29 2c 20 48 45 58 , EVP_md5(), HEX
7dd0: 5f 46 4f 52 4d 41 54 2c 20 4e 55 4c 4c 29 3b 0a _FORMAT, NULL);.
7de0: 7d 0a 0a 69 6e 74 20 44 69 67 65 73 74 53 48 41 }..int DigestSHA
7df0: 31 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 61 20 1Cmd(ClientData
7e00: 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 6c 5f clientData, Tcl_
7e10: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
7e20: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
7e30: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 j *const objv[])
7e40: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 6c {. return Tl
7e50: 73 5f 44 69 67 65 73 74 44 61 74 61 28 69 6e 74 s_DigestData(int
7e60: 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c erp, objc, objv,
7e70: 20 45 56 50 5f 73 68 61 31 28 29 2c 20 48 45 58 EVP_sha1(), HEX
7e80: 5f 46 4f 52 4d 41 54 2c 20 4e 55 4c 4c 29 3b 0a _FORMAT, NULL);.
7e90: 7d 0a 0a 69 6e 74 20 44 69 67 65 73 74 53 48 41 }..int DigestSHA
7ea0: 32 35 36 43 6d 64 28 43 6c 69 65 6e 74 44 61 74 256Cmd(ClientDat
7eb0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63 a clientData, Tc
7ec0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
7ed0: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f , int objc, Tcl_
7ee0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b Obj *const objv[
7ef0: 5d 29 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 ]) {. return
7f00: 54 6c 73 5f 44 69 67 65 73 74 44 61 74 61 28 69 Tls_DigestData(i
7f10: 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a nterp, objc, obj
7f20: 76 2c 20 45 56 50 5f 73 68 61 32 35 36 28 29 2c v, EVP_sha256(),
7f30: 20 48 45 58 5f 46 4f 52 4d 41 54 2c 20 4e 55 4c HEX_FORMAT, NUL
7f40: 4c 29 3b 0a 7d 0a 0a 69 6e 74 20 44 69 67 65 73 L);.}..int Diges
7f50: 74 53 48 41 35 31 32 43 6d 64 28 43 6c 69 65 6e tSHA512Cmd(Clien
7f60: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
7f70: 2c 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e , Tcl_Interp *in
7f80: 74 65 72 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 terp, int objc,
7f90: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f Tcl_Obj *const o
7fa0: 62 6a 76 5b 5d 29 20 7b 0a 20 20 20 20 72 65 74 bjv[]) {. ret
7fb0: 75 72 6e 20 54 6c 73 5f 44 69 67 65 73 74 44 61 urn Tls_DigestDa
7fc0: 74 61 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c ta(interp, objc,
7fd0: 20 6f 62 6a 76 2c 20 45 56 50 5f 73 68 61 35 31 objv, EVP_sha51
7fe0: 32 28 29 2c 20 48 45 58 5f 46 4f 52 4d 41 54 2c 2(), HEX_FORMAT,
7ff0: 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 20 2a NULL);.}../*. *
8000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8040: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 6c 73 5f 44 69 ---. *. * Tls_Di
8050: 67 65 73 74 43 6f 6d 6d 61 6e 64 73 20 2d 2d 0a gestCommands --.
8060: 20 2a 0a 20 2a 09 43 72 65 61 74 65 20 64 69 67 *. *.Create dig
8070: 65 73 74 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a est commands. *.
8080: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 * Returns:. *.T
8090: 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 CL_OK or TCL_ERR
80a0: 4f 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 OR. *. * Side ef
80b0: 66 65 63 74 73 3a 0a 20 2a 09 43 72 65 61 74 65 fects:. *.Create
80c0: 73 20 63 6f 6d 6d 61 6e 64 73 0a 20 2a 0a 20 2a s commands. *. *
80d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
80e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
80f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8110: 2d 2d 2d 0a 20 2a 2f 0a 69 6e 74 20 54 6c 73 5f ---. */.int Tls_
8120: 44 69 67 65 73 74 43 6f 6d 6d 61 6e 64 73 28 54 DigestCommands(T
8130: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
8140: 70 29 20 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 p) {. Tcl_Cre
8150: 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e ateObjCommand(in
8160: 74 65 72 70 2c 20 22 74 6c 73 3a 3a 64 69 67 65 terp, "tls::dige
8170: 73 74 22 2c 20 44 69 67 65 73 74 4f 62 6a 43 6d st", DigestObjCm
8180: 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
8190: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
81a0: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
81b0: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
81c0: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
81d0: 20 22 74 6c 73 3a 3a 6d 64 34 22 2c 20 44 69 67 "tls::md4", Dig
81e0: 65 73 74 4d 44 34 43 6d 64 2c 20 28 43 6c 69 65 estMD4Cmd, (Clie
81f0: 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f ntData) 0, (Tcl_
8200: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
8210: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
8220: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
8230: 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 6d (interp, "tls::m
8240: 64 35 22 2c 20 44 69 67 65 73 74 4d 44 35 43 6d d5", DigestMD5Cm
8250: 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 d, (ClientData)
8260: 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 0, (Tcl_CmdDelet
8270: 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a eProc *) NULL);.
8280: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 Tcl_CreateOb
8290: 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c jCommand(interp,
82a0: 20 22 74 6c 73 3a 3a 73 68 61 31 22 2c 20 44 69 "tls::sha1", Di
82b0: 67 65 73 74 53 48 41 31 43 6d 64 2c 20 28 43 6c gestSHA1Cmd, (Cl
82c0: 69 65 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 ientData) 0, (Tc
82d0: 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 l_CmdDeleteProc
82e0: 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 *) NULL);. Tc
82f0: 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 l_CreateObjComma
8300: 6e 64 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a nd(interp, "tls:
8310: 3a 73 68 61 32 35 36 22 2c 20 44 69 67 65 73 74 :sha256", Digest
8320: 53 48 41 32 35 36 43 6d 64 2c 20 28 43 6c 69 65 SHA256Cmd, (Clie
8330: 6e 74 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f ntData) 0, (Tcl_
8340: 43 6d 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 CmdDeleteProc *)
8350: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f NULL);. Tcl_
8360: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 CreateObjCommand
8370: 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 (interp, "tls::s
8380: 68 61 35 31 32 22 2c 20 44 69 67 65 73 74 53 48 ha512", DigestSH
8390: 41 35 31 32 43 6d 64 2c 20 28 43 6c 69 65 6e 74 A512Cmd, (Client
83a0: 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d Data) 0, (Tcl_Cm
83b0: 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e dDeleteProc *) N
83c0: 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72 ULL);. Tcl_Cr
83d0: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 eateObjCommand(i
83e0: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 75 6e 73 nterp, "tls::uns
83f0: 74 61 63 6b 22 2c 20 55 6e 73 74 61 63 6b 4f 62 tack", UnstackOb
8400: 6a 43 6d 64 2c 20 28 43 6c 69 65 6e 74 44 61 74 jCmd, (ClientDat
8410: 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d 64 44 65 a) 0, (Tcl_CmdDe
8420: 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e 55 4c 4c leteProc *) NULL
8430: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
8440: 4c 5f 4f 4b 3b 0a 7d 0a 0a L_OK;.}..