0000: 2f 2a 0a 20 2a 20 43 72 79 70 74 6f 67 72 61 70 /*. * Cryptograp
0010: 68 69 63 20 55 74 69 6c 69 74 79 20 46 75 6e 63 hic Utility Func
0020: 74 69 6f 6e 73 0a 20 2a 0a 20 2a 20 50 72 6f 76 tions. *. * Prov
0030: 69 64 65 73 20 63 6f 6d 6d 61 6e 64 73 20 74 6f ides commands to
0040: 20 64 65 72 69 76 65 20 6b 65 79 73 2e 0a 20 2a derive keys.. *
0050: 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 28 43 . * Copyright (C
0060: 29 20 32 30 32 33 20 42 72 69 61 6e 20 4f 27 48 ) 2023 Brian O'H
0070: 61 67 61 6e 0a 20 2a 0a 20 2a 2f 0a 0a 23 69 6e agan. *. */..#in
0080: 63 6c 75 64 65 20 22 74 6c 73 49 6e 74 2e 68 22 clude "tlsInt.h"
0090: 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 4f 70 .#include "tclOp
00a0: 74 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c ts.h".#include <
00b0: 6f 70 65 6e 73 73 6c 2f 65 76 70 2e 68 3e 0a 0a openssl/evp.h>..
00c0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
00d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
00e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
00f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
0110: 55 74 69 6c 5f 47 65 74 43 69 70 68 65 72 20 2d Util_GetCipher -
0120: 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 73 79 6d 6d -. *. *.Get symm
0130: 65 74 72 69 63 20 63 69 70 68 65 72 20 66 72 6f etric cipher fro
0140: 6d 20 54 63 6c 4f 62 6a 0a 20 2a 0a 20 2a 20 52 m TclObj. *. * R
0150: 65 74 75 72 6e 73 3a 0a 20 2a 09 50 6f 69 6e 74 eturns:. *.Point
0160: 65 72 20 74 6f 20 74 79 70 65 20 6f 72 20 4e 55 er to type or NU
0170: 4c 4c 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 LL. *. * Side ef
0180: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 fects:. *.None.
0190: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
01a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
01b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
01c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
01d0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 45 56 50 5f -------. */.EVP_
01e0: 43 49 50 48 45 52 20 2a 55 74 69 6c 5f 47 65 74 CIPHER *Util_Get
01f0: 43 69 70 68 65 72 28 54 63 6c 5f 49 6e 74 65 72 Cipher(Tcl_Inter
0200: 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f p *interp, Tcl_O
0210: 62 6a 20 2a 63 69 70 68 65 72 4f 62 6a 2c 20 69 bj *cipherObj, i
0220: 6e 74 20 6e 6f 5f 6e 75 6c 6c 29 20 7b 0a 20 20 nt no_null) {.
0230: 20 20 45 56 50 5f 43 49 50 48 45 52 20 2a 63 69 EVP_CIPHER *ci
0240: 70 68 65 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 pher = NULL;.
0250: 20 63 68 61 72 20 2a 6e 61 6d 65 20 3d 20 4e 55 char *name = NU
0260: 4c 4c 3b 0a 0a 20 20 20 20 69 66 20 28 63 69 70 LL;.. if (cip
0270: 68 65 72 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 herObj != NULL)
0280: 7b 0a 09 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 {..name = Tcl_Ge
0290: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 63 tStringFromObj(c
02a0: 69 70 68 65 72 4f 62 6a 2c 20 28 54 63 6c 5f 53 ipherObj, (Tcl_S
02b0: 69 7a 65 20 2a 29 20 4e 55 4c 4c 29 3b 0a 23 69 ize *) NULL);.#i
02c0: 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 49 4f f OPENSSL_VERSIO
02d0: 4e 5f 4e 55 4d 42 45 52 20 3c 20 30 78 33 30 30 N_NUMBER < 0x300
02e0: 30 30 30 30 30 4c 0a 09 63 69 70 68 65 72 20 3d 00000L..cipher =
02f0: 20 45 56 50 5f 67 65 74 5f 63 69 70 68 65 72 62 EVP_get_cipherb
0300: 79 6e 61 6d 65 28 6e 61 6d 65 29 3b 0a 23 65 6c yname(name);.#el
0310: 73 65 0a 09 63 69 70 68 65 72 20 3d 20 45 56 50 se..cipher = EVP
0320: 5f 43 49 50 48 45 52 5f 66 65 74 63 68 28 4e 55 _CIPHER_fetch(NU
0330: 4c 4c 2c 20 6e 61 6d 65 2c 20 4e 55 4c 4c 29 3b LL, name, NULL);
0340: 0a 23 65 6e 64 69 66 0a 09 69 66 20 28 63 69 70 .#endif..if (cip
0350: 68 65 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 her == NULL) {..
0360: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 Tcl_AppendRe
0370: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 69 6e sult(interp, "in
0380: 76 61 6c 69 64 20 63 69 70 68 65 72 20 5c 22 22 valid cipher \""
0390: 2c 20 6e 61 6d 65 2c 20 22 5c 22 22 2c 20 28 63 , name, "\"", (c
03a0: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 7d har *) NULL);..}
03b0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
03c0: 6e 6f 5f 6e 75 6c 6c 29 20 7b 0a 09 54 63 6c 5f no_null) {..Tcl_
03d0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 AppendResult(int
03e0: 65 72 70 2c 20 22 6e 6f 20 63 69 70 68 65 72 22 erp, "no cipher"
03f0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
0400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 ;. }. retu
0410: 72 6e 20 63 69 70 68 65 72 3b 0a 7d 0a 0a 2f 2a rn cipher;.}../*
0420: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
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 0a 20 2a 0a 20 2a 20 55 74 69 ------. *. * Uti
0470: 6c 5f 47 65 74 44 69 67 65 73 74 20 2d 2d 0a 20 l_GetDigest --.
0480: 2a 0a 20 2a 09 47 65 74 20 6d 65 73 73 61 67 65 *. *.Get message
0490: 20 64 69 67 65 73 74 20 28 4d 44 29 20 6f 72 20 digest (MD) or
04a0: 68 61 73 68 20 66 72 6f 6d 20 54 63 6c 4f 62 6a hash from TclObj
04b0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a . *. * Returns:.
04c0: 20 2a 09 50 6f 69 6e 74 65 72 20 74 6f 20 74 79 *.Pointer to ty
04d0: 70 65 20 6f 72 20 4e 55 4c 4c 0a 20 2a 0a 20 2a pe or NULL. *. *
04e0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
04f0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d *.None. *. *----
0500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0510: 2d 2d 2d 2d 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 0a ---------------.
0540: 20 2a 2f 0a 45 56 50 5f 4d 44 20 2a 55 74 69 6c */.EVP_MD *Util
0550: 5f 47 65 74 44 69 67 65 73 74 28 54 63 6c 5f 49 _GetDigest(Tcl_I
0560: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 nterp *interp, T
0570: 63 6c 5f 4f 62 6a 20 2a 64 69 67 65 73 74 4f 62 cl_Obj *digestOb
0580: 6a 2c 20 69 6e 74 20 6e 6f 5f 6e 75 6c 6c 29 20 j, int no_null)
0590: 7b 0a 20 20 20 20 45 56 50 5f 4d 44 20 2a 6d 64 {. EVP_MD *md
05a0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 63 68 61 = NULL;. cha
05b0: 72 20 2a 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a r *name = NULL;.
05c0: 0a 20 20 20 20 69 66 20 28 64 69 67 65 73 74 4f . if (digestO
05d0: 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6e bj != NULL) {..n
05e0: 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 ame = Tcl_GetStr
05f0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 64 69 67 65 73 ingFromObj(diges
0600: 74 4f 62 6a 2c 20 28 54 63 6c 5f 53 69 7a 65 20 tObj, (Tcl_Size
0610: 2a 29 20 4e 55 4c 4c 29 3b 0a 23 69 66 20 4f 50 *) NULL);.#if OP
0620: 45 4e 53 53 4c 5f 56 45 52 53 49 4f 4e 5f 4e 55 ENSSL_VERSION_NU
0630: 4d 42 45 52 20 3c 20 30 78 33 30 30 30 30 30 30 MBER < 0x3000000
0640: 30 4c 0a 09 6d 64 20 3d 20 45 56 50 5f 67 65 74 0L..md = EVP_get
0650: 5f 64 69 67 65 73 74 62 79 6e 61 6d 65 28 6e 61 _digestbyname(na
0660: 6d 65 29 3b 0a 23 65 6c 73 65 0a 09 6d 64 20 3d me);.#else..md =
0670: 20 45 56 50 5f 4d 44 5f 66 65 74 63 68 28 4e 55 EVP_MD_fetch(NU
0680: 4c 4c 2c 20 6e 61 6d 65 2c 20 4e 55 4c 4c 29 3b LL, name, NULL);
0690: 0a 23 65 6e 64 69 66 0a 09 69 66 20 28 6d 64 20 .#endif..if (md
06a0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 == NULL) {..
06b0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 Tcl_AppendResult
06c0: 28 69 6e 74 65 72 70 2c 20 22 69 6e 76 61 6c 69 (interp, "invali
06d0: 64 20 64 69 67 65 73 74 20 5c 22 22 2c 20 6e 61 d digest \"", na
06e0: 6d 65 2c 20 22 5c 22 22 2c 20 28 63 68 61 72 20 me, "\"", (char
06f0: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 20 20 20 *) NULL);..}.
0700: 20 7d 20 65 6c 73 65 20 69 66 20 28 6e 6f 5f 6e } else if (no_n
0710: 75 6c 6c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 ull) {..Tcl_Appe
0720: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
0730: 20 22 6e 6f 20 64 69 67 65 73 74 22 2c 20 28 63 "no digest", (c
0740: 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 har *) NULL);.
0750: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6d }. return m
0760: 64 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d d;.}../*. *-----
0770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
07a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
07b0: 2a 0a 20 2a 20 55 74 69 6c 5f 47 65 74 49 56 20 *. * Util_GetIV
07c0: 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 65 6e 63 --. *. *.Get enc
07d0: 72 79 70 74 69 6f 6e 20 69 6e 69 74 69 61 6c 69 ryption initiali
07e0: 7a 61 74 69 6f 6e 20 76 65 63 74 6f 72 20 6f 72 zation vector or
07f0: 20 73 65 65 64 20 66 72 6f 6d 20 54 63 6c 4f 62 seed from TclOb
0800: 6a 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a j. *. * Returns:
0810: 0a 20 2a 09 50 6f 69 6e 74 65 72 20 74 6f 20 74 . *.Pointer to t
0820: 79 70 65 20 6f 72 20 4e 55 4c 4c 2c 20 61 6e 64 ype or NULL, and
0830: 20 73 69 7a 65 0a 20 2a 0a 20 2a 20 53 69 64 65 size. *. * Side
0840: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e effects:. *.Non
0850: 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d e. *. *---------
0860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 75 ----------. */.u
08a0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 55 74 nsigned char *Ut
08b0: 69 6c 5f 47 65 74 49 56 28 54 63 6c 5f 49 6e 74 il_GetIV(Tcl_Int
08c0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c erp *interp, Tcl
08d0: 5f 4f 62 6a 20 2a 69 76 4f 62 6a 2c 20 54 63 6c _Obj *ivObj, Tcl
08e0: 5f 53 69 7a 65 20 2a 6c 65 6e 2c 20 69 6e 74 20 _Size *len, int
08f0: 6d 61 78 2c 20 69 6e 74 20 6e 6f 5f 6e 75 6c 6c max, int no_null
0900: 29 20 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 ) {. unsigned
0910: 20 63 68 61 72 20 2a 69 76 20 3d 20 4e 55 4c 4c char *iv = NULL
0920: 3b 0a 20 20 20 20 2a 6c 65 6e 20 3d 20 30 3b 0a ;. *len = 0;.
0930: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 73 69 7a Tcl_Size siz
0940: 65 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 20 28 e = 0;.. if (
0950: 69 76 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b ivObj != NULL) {
0960: 0a 09 69 76 20 3d 20 54 63 6c 5f 47 65 74 42 79 ..iv = Tcl_GetBy
0970: 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 69 teArrayFromObj(i
0980: 76 4f 62 6a 2c 20 26 73 69 7a 65 29 3b 0a 09 2a vObj, &size);..*
0990: 6c 65 6e 20 3d 20 28 69 6e 74 29 20 73 69 7a 65 len = (int) size
09a0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 ;. } else if
09b0: 28 6e 6f 5f 6e 75 6c 6c 29 20 7b 0a 09 54 63 6c (no_null) {..Tcl
09c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e _AppendResult(in
09d0: 74 65 72 70 2c 20 22 6e 6f 20 69 6e 69 74 69 61 terp, "no initia
09e0: 6c 69 7a 61 74 69 6f 6e 20 76 65 63 74 6f 72 20 lization vector
09f0: 28 49 56 29 22 2c 20 28 63 68 61 72 20 2a 29 20 (IV)", (char *)
0a00: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e NULL);..return N
0a10: 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ULL;. }..
0a20: 69 66 20 28 6d 61 78 20 3e 20 30 20 26 26 20 2a if (max > 0 && *
0a30: 6c 65 6e 20 3e 20 6d 61 78 29 20 7b 0a 09 54 63 len > max) {..Tc
0a40: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
0a50: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 nterp, Tcl_ObjPr
0a60: 69 6e 74 66 28 22 49 56 20 74 6f 6f 20 6c 6f 6e intf("IV too lon
0a70: 67 2e 20 4d 75 73 74 20 62 65 20 3c 3d 20 25 64 g. Must be <= %d
0a80: 20 62 79 74 65 73 22 2c 20 6d 61 78 29 29 3b 0a bytes", max));.
0a90: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
0aa0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 69 }. return i
0ab0: 76 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d v;.}../*. *-----
0ac0: 2d 2d 2d 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 0a 20 --------------.
0b00: 2a 0a 20 2a 20 55 74 69 6c 5f 47 65 74 4b 65 79 *. * Util_GetKey
0b10: 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 65 6e --. *. *.Get en
0b20: 63 72 79 70 74 69 6f 6e 20 6b 65 79 20 6f 72 20 cryption key or
0b30: 70 61 73 73 77 6f 72 64 20 66 72 6f 6d 20 54 63 password from Tc
0b40: 6c 4f 62 6a 0a 20 2a 0a 20 2a 20 52 65 74 75 72 lObj. *. * Retur
0b50: 6e 73 3a 0a 20 2a 09 50 6f 69 6e 74 65 72 20 74 ns:. *.Pointer t
0b60: 6f 20 74 79 70 65 20 6f 72 20 4e 55 4c 4c 2c 20 o type or NULL,
0b70: 61 6e 64 20 73 69 7a 65 0a 20 2a 0a 20 2a 20 53 and size. *. * S
0b80: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
0b90: 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d None. *. *------
0ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
0be0: 2f 0a 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 /.unsigned char
0bf0: 2a 55 74 69 6c 5f 47 65 74 4b 65 79 28 54 63 6c *Util_GetKey(Tcl
0c00: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
0c10: 20 54 63 6c 5f 4f 62 6a 20 2a 6b 65 79 4f 62 6a Tcl_Obj *keyObj
0c20: 2c 20 54 63 6c 5f 53 69 7a 65 20 2a 6c 65 6e 2c , Tcl_Size *len,
0c30: 20 63 68 61 72 20 2a 6e 61 6d 65 2c 20 69 6e 74 char *name, int
0c40: 20 6d 61 78 2c 20 69 6e 74 20 6e 6f 5f 6e 75 6c max, int no_nul
0c50: 6c 29 20 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 l) {. unsigne
0c60: 64 20 63 68 61 72 20 2a 6b 65 79 20 3d 20 4e 55 d char *key = NU
0c70: 4c 4c 3b 0a 20 20 20 20 2a 6c 65 6e 20 3d 20 30 LL;. *len = 0
0c80: 3b 0a 0a 20 20 20 20 69 66 20 28 6b 65 79 4f 62 ;.. if (keyOb
0c90: 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6b 65 j != NULL) {..ke
0ca0: 79 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 y = Tcl_GetByteA
0cb0: 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6b 65 79 4f rrayFromObj(keyO
0cc0: 62 6a 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 7d 20 bj, len);. }
0cd0: 65 6c 73 65 20 69 66 20 28 6e 6f 5f 6e 75 6c 6c else if (no_null
0ce0: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 ) {..Tcl_AppendR
0cf0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 6e esult(interp, "n
0d00: 6f 20 22 2c 20 6e 61 6d 65 2c 20 28 63 68 61 72 o ", name, (char
0d10: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 *) NULL);..retu
0d20: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a rn NULL;. }..
0d30: 20 20 20 20 69 66 20 28 6d 61 78 20 3e 20 30 20 if (max > 0
0d40: 26 26 20 2a 6c 65 6e 20 3e 20 6d 61 78 29 20 7b && *len > max) {
0d50: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 ..Tcl_SetObjResu
0d60: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f lt(interp, Tcl_O
0d70: 62 6a 50 72 69 6e 74 66 28 22 49 6e 76 61 6c 69 bjPrintf("Invali
0d80: 64 20 25 73 20 6c 65 6e 67 74 68 2e 20 4d 75 73 d %s length. Mus
0d90: 74 20 62 65 20 3c 3d 20 25 64 20 62 79 74 65 73 t be <= %d bytes
0da0: 22 2c 20 6e 61 6d 65 2c 20 6d 61 78 29 29 3b 0a ", name, max));.
0db0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
0dc0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 6b }. return k
0dd0: 65 79 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d ey;.}../*. *----
0de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
0e20: 20 2a 0a 20 2a 20 55 74 69 6c 5f 47 65 74 4d 41 *. * Util_GetMA
0e30: 43 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 4d C --. *. *.Get M
0e40: 65 73 73 61 67 65 20 41 75 74 68 65 6e 74 69 63 essage Authentic
0e50: 61 74 69 6f 6e 20 43 6f 64 65 20 28 4d 41 43 29 ation Code (MAC)
0e60: 20 66 72 6f 6d 20 54 63 6c 4f 62 6a 0a 20 2a 0a from TclObj. *.
0e70: 20 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 50 * Returns:. *.P
0e80: 6f 69 6e 74 65 72 20 74 6f 20 74 79 70 65 20 6f ointer to type o
0e90: 72 20 4e 55 4c 4c 0a 20 2a 0a 20 2a 20 53 69 64 r NULL. *. * Sid
0ea0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
0eb0: 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d ne. *. *--------
0ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
0f00: 23 69 66 20 4f 50 45 4e 53 53 4c 5f 56 45 52 53 #if OPENSSL_VERS
0f10: 49 4f 4e 5f 4e 55 4d 42 45 52 20 3e 3d 20 30 78 ION_NUMBER >= 0x
0f20: 33 30 30 30 30 30 30 30 4c 0a 45 56 50 5f 4d 41 30000000L.EVP_MA
0f30: 43 20 2a 55 74 69 6c 5f 47 65 74 4d 41 43 28 54 C *Util_GetMAC(T
0f40: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
0f50: 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 4d 61 63 4f p, Tcl_Obj *MacO
0f60: 62 6a 2c 20 69 6e 74 20 6e 6f 5f 6e 75 6c 6c 29 bj, int no_null)
0f70: 20 7b 0a 20 20 20 20 45 56 50 5f 4d 41 43 20 2a {. EVP_MAC *
0f80: 6d 61 63 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 mac = NULL;.
0f90: 63 68 61 72 20 2a 6e 61 6d 65 20 3d 20 4e 55 4c char *name = NUL
0fa0: 4c 3b 0a 0a 20 20 20 20 69 66 20 28 4d 61 63 4f L;.. if (MacO
0fb0: 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6e bj != NULL) {..n
0fc0: 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 ame = Tcl_GetStr
0fd0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 4d 61 63 4f 62 ingFromObj(MacOb
0fe0: 6a 2c 20 28 54 63 6c 5f 53 69 7a 65 20 2a 29 20 j, (Tcl_Size *)
0ff0: 4e 55 4c 4c 29 3b 0a 09 6d 61 63 20 3d 20 45 56 NULL);..mac = EV
1000: 50 5f 4d 41 43 5f 66 65 74 63 68 28 4e 55 4c 4c P_MAC_fetch(NULL
1010: 2c 20 6e 61 6d 65 2c 20 4e 55 4c 4c 29 3b 0a 09 , name, NULL);..
1020: 69 66 20 28 6d 61 63 20 3d 3d 20 4e 55 4c 4c 29 if (mac == NULL)
1030: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 {.. Tcl_Appe
1040: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c ndResult(interp,
1050: 20 22 69 6e 76 61 6c 69 64 20 4d 41 43 20 5c 22 "invalid MAC \"
1060: 22 2c 20 6e 61 6d 65 2c 20 22 5c 22 22 2c 20 28 ", name, "\"", (
1070: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
1080: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b return NULL;
1090: 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 ..}. } else i
10a0: 66 20 28 6e 6f 5f 6e 75 6c 6c 29 20 7b 0a 09 54 f (no_null) {..T
10b0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 cl_AppendResult(
10c0: 69 6e 74 65 72 70 2c 20 22 6e 6f 20 4d 41 43 22 interp, "no MAC"
10d0: 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 , (char *) NULL)
10e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 ;. }. retu
10f0: 72 6e 20 6d 61 63 3b 0a 7d 0a 23 65 6e 64 69 66 rn mac;.}.#endif
1100: 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
1110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
1150: 20 55 74 69 6c 5f 47 65 74 53 61 6c 74 20 2d 2d Util_GetSalt --
1160: 0a 20 2a 0a 20 2a 09 47 65 74 20 65 6e 63 72 79 . *. *.Get encry
1170: 70 74 69 6f 6e 20 73 61 6c 74 20 66 72 6f 6d 20 ption salt from
1180: 54 63 6c 4f 62 6a 0a 20 2a 0a 20 2a 20 52 65 74 TclObj. *. * Ret
1190: 75 72 6e 73 3a 0a 20 2a 09 50 6f 69 6e 74 65 72 urns:. *.Pointer
11a0: 20 74 6f 20 74 79 70 65 20 6f 72 20 4e 55 4c 4c to type or NULL
11b0: 2c 20 61 6e 64 20 73 69 7a 65 0a 20 2a 0a 20 2a , and size. *. *
11c0: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
11d0: 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d *.None. *. *----
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 2d 2d ----------------
1210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
1220: 20 2a 2f 0a 75 6e 73 69 67 6e 65 64 20 63 68 61 */.unsigned cha
1230: 72 20 2a 55 74 69 6c 5f 47 65 74 53 61 6c 74 28 r *Util_GetSalt(
1240: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
1250: 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 73 61 6c rp, Tcl_Obj *sal
1260: 74 4f 62 6a 2c 20 54 63 6c 5f 53 69 7a 65 20 2a tObj, Tcl_Size *
1270: 6c 65 6e 2c 20 69 6e 74 20 6d 61 78 2c 20 69 6e len, int max, in
1280: 74 20 6e 6f 5f 6e 75 6c 6c 29 20 7b 0a 20 20 20 t no_null) {.
1290: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a unsigned char *
12a0: 73 61 6c 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 salt = NULL;.
12b0: 20 2a 6c 65 6e 20 3d 20 30 3b 0a 0a 20 20 20 20 *len = 0;..
12c0: 69 66 20 28 73 61 6c 74 4f 62 6a 20 21 3d 20 4e if (saltObj != N
12d0: 55 4c 4c 29 20 7b 0a 09 73 61 6c 74 20 3d 20 54 ULL) {..salt = T
12e0: 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 cl_GetByteArrayF
12f0: 72 6f 6d 4f 62 6a 28 73 61 6c 74 4f 62 6a 2c 20 romObj(saltObj,
1300: 6c 65 6e 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 len);. } else
1310: 20 69 66 20 28 6e 6f 5f 6e 75 6c 6c 29 20 7b 0a if (no_null) {.
1320: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c .Tcl_AppendResul
1330: 74 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 73 61 t(interp, "no sa
1340: 6c 74 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 lt", (char *) NU
1350: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c LL);..return NUL
1360: 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 L;. }.. if
1370: 20 28 6d 61 78 20 3e 20 30 20 26 26 20 2a 6c 65 (max > 0 && *le
1380: 6e 20 3e 20 6d 61 78 29 20 7b 0a 09 54 63 6c 5f n > max) {..Tcl_
1390: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
13a0: 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e erp, Tcl_ObjPrin
13b0: 74 66 28 22 53 61 6c 74 20 74 6f 6f 20 6c 6f 6e tf("Salt too lon
13c0: 67 2e 20 4d 75 73 74 20 62 65 20 3c 3d 20 25 64 g. Must be <= %d
13d0: 20 62 79 74 65 73 22 2c 20 6d 61 78 29 29 3b 0a bytes", max));.
13e0: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 .return NULL;.
13f0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 73 }. return s
1400: 61 6c 74 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a alt;.}../*******
1410: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1420: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1430: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
1440: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 0a 2f ************/../
1450: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
1460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1490: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 55 74 -------. *. * Ut
14a0: 69 6c 5f 47 65 74 42 69 6e 61 72 79 41 72 72 61 il_GetBinaryArra
14b0: 79 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 74 20 62 y --. *. *.Get b
14c0: 69 6e 61 72 79 20 61 72 72 61 79 20 66 72 6f 6d inary array from
14d0: 20 54 63 6c 4f 62 6a 0a 20 2a 0a 20 2a 20 52 65 TclObj. *. * Re
14e0: 74 75 72 6e 73 3a 0a 20 2a 09 50 6f 69 6e 74 65 turns:. *.Pointe
14f0: 72 20 74 6f 20 74 79 70 65 20 6f 72 20 4e 55 4c r to type or NUL
1500: 4c 2c 20 61 6e 64 20 73 69 7a 65 0a 20 2a 0a 20 L, and size. *.
1510: 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a * Side effects:.
1520: 20 2a 09 4e 6f 6e 65 0a 20 2a 0a 20 2a 2d 2d 2d *.None. *. *---
1530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1570: 0a 20 2a 2f 0a 75 6e 73 69 67 6e 65 64 20 63 68 . */.unsigned ch
1580: 61 72 20 2a 55 74 69 6c 5f 47 65 74 42 69 6e 61 ar *Util_GetBina
1590: 72 79 41 72 72 61 79 28 54 63 6c 5f 49 6e 74 65 ryArray(Tcl_Inte
15a0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f rp *interp, Tcl_
15b0: 4f 62 6a 20 2a 64 61 74 61 4f 62 6a 2c 20 54 63 Obj *dataObj, Tc
15c0: 6c 5f 53 69 7a 65 20 2a 6c 65 6e 2c 0a 09 63 68 l_Size *len,..ch
15d0: 61 72 20 2a 6e 61 6d 65 2c 20 54 63 6c 5f 53 69 ar *name, Tcl_Si
15e0: 7a 65 20 6d 69 6e 2c 20 54 63 6c 5f 53 69 7a 65 ze min, Tcl_Size
15f0: 20 6d 61 78 2c 20 69 6e 74 20 6e 6f 5f 6e 75 6c max, int no_nul
1600: 6c 29 20 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65 l) {. unsigne
1610: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 4e d char *data = N
1620: 55 4c 4c 3b 0a 20 20 20 20 2a 6c 65 6e 20 3d 20 ULL;. *len =
1630: 30 3b 0a 0a 20 20 20 20 69 66 20 28 64 61 74 61 0;.. if (data
1640: 4f 62 6a 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 Obj != NULL) {..
1650: 64 61 74 61 20 3d 20 54 63 6c 5f 47 65 74 42 79 data = Tcl_GetBy
1660: 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 64 teArrayFromObj(d
1670: 61 74 61 4f 62 6a 2c 20 6c 65 6e 29 3b 0a 20 20 ataObj, len);.
1680: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6e 6f 5f } else if (no_
1690: 6e 75 6c 6c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 null) {..Tcl_App
16a0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 endResult(interp
16b0: 2c 20 22 6e 6f 20 22 2c 20 6e 61 6d 65 2c 20 28 , "no ", name, (
16c0: 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 char *) NULL);..
16d0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
16e0: 20 7d 0a 0a 20 20 20 20 69 66 20 28 2a 6c 65 6e }.. if (*len
16f0: 20 3c 20 6d 69 6e 29 20 7b 0a 09 54 63 6c 5f 53 < min) {..Tcl_S
1700: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
1710: 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 rp, Tcl_ObjPrint
1720: 66 28 22 49 6e 76 61 6c 69 64 20 6c 65 6e 67 74 f("Invalid lengt
1730: 68 20 66 6f 72 20 5c 22 25 73 5c 22 3a 20 6d 75 h for \"%s\": mu
1740: 73 74 20 62 65 20 3e 3d 20 25 64 22 2c 20 6e 61 st be >= %d", na
1750: 6d 65 2c 20 6d 69 6e 29 29 3b 0a 09 72 65 74 75 me, min));..retu
1760: 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 20 65 rn NULL;. } e
1770: 6c 73 65 20 69 66 20 28 6d 61 78 20 3e 20 30 20 lse if (max > 0
1780: 26 26 20 2a 6c 65 6e 20 3e 20 6d 61 78 29 20 7b && *len > max) {
1790: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 ..Tcl_SetObjResu
17a0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f lt(interp, Tcl_O
17b0: 62 6a 50 72 69 6e 74 66 28 22 49 6e 76 61 6c 69 bjPrintf("Invali
17c0: 64 20 6c 65 6e 67 74 68 20 66 6f 72 20 5c 22 25 d length for \"%
17d0: 73 5c 22 3a 20 6d 75 73 74 20 62 65 20 3c 3d 20 s\": must be <=
17e0: 25 64 22 2c 20 6e 61 6d 65 2c 20 6d 61 78 29 29 %d", name, max))
17f0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
1800: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
1810: 20 64 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d data;.}../*. *-
1820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1850: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1860: 2d 2d 0a 20 2a 0a 20 2a 20 55 74 69 6c 5f 47 65 --. *. * Util_Ge
1870: 74 49 6e 74 20 2d 2d 0a 20 2a 0a 20 2a 09 47 65 tInt --. *. *.Ge
1880: 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 t integer value
1890: 66 72 6f 6d 20 54 63 6c 4f 62 6a 0a 20 2a 0a 20 from TclObj. *.
18a0: 2a 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 * Returns:. *.TC
18b0: 4c 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f L_OK or TCL_ERRO
18c0: 52 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 R. *. * Side eff
18d0: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 0a 20 2a ects:. *.None. *
18e0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
18f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1920: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 20 ------. */..int
1930: 55 74 69 6c 5f 47 65 74 49 6e 74 28 54 63 6c 5f Util_GetInt(Tcl_
1940: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
1950: 54 63 6c 5f 4f 62 6a 20 2a 64 61 74 61 4f 62 6a Tcl_Obj *dataObj
1960: 2c 20 69 6e 74 20 2a 76 61 6c 75 65 2c 20 63 68 , int *value, ch
1970: 61 72 20 2a 6e 61 6d 65 2c 20 69 6e 74 20 6d 69 ar *name, int mi
1980: 6e 2c 20 69 6e 74 20 6d 61 78 29 20 7b 0a 0a 20 n, int max) {..
1990: 20 20 20 69 66 20 28 64 61 74 61 4f 62 6a 20 21 if (dataObj !
19a0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 54 = NULL) {..if (T
19b0: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a cl_GetIntFromObj
19c0: 28 69 6e 74 65 72 70 2c 20 64 61 74 61 4f 62 6a (interp, dataObj
19d0: 2c 20 76 61 6c 75 65 29 20 21 3d 20 54 43 4c 5f , value) != TCL_
19e0: 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 OK) {.. retur
19f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
1a00: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 56 61 }.. /* Va
1a10: 6c 69 64 61 74 65 20 72 61 6e 67 65 20 2a 2f 0a lidate range */.
1a20: 20 20 20 20 69 66 20 28 2a 76 61 6c 75 65 20 3c if (*value <
1a30: 20 6d 69 6e 29 20 7b 0a 09 54 63 6c 5f 53 65 74 min) {..Tcl_Set
1a40: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
1a50: 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 , Tcl_ObjPrintf(
1a60: 22 69 6e 76 61 6c 69 64 20 76 61 6c 75 65 20 5c "invalid value \
1a70: 22 25 64 5c 22 20 66 6f 72 20 6f 70 74 69 6f 6e "%d\" for option
1a80: 20 5c 22 25 73 5c 22 3a 20 6d 75 73 74 20 62 65 \"%s\": must be
1a90: 20 3e 3d 20 25 64 22 2c 20 2a 76 61 6c 75 65 2c >= %d", *value,
1aa0: 20 6e 61 6d 65 2c 20 6d 69 6e 29 29 3b 0a 09 72 name, min));..r
1ab0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
1ac0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
1ad0: 6d 61 78 20 3e 20 30 20 26 26 20 2a 76 61 6c 75 max > 0 && *valu
1ae0: 65 20 3e 20 6d 61 78 29 20 7b 0a 09 54 63 6c 5f e > max) {..Tcl_
1af0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
1b00: 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e erp, Tcl_ObjPrin
1b10: 74 66 28 22 69 6e 76 61 6c 69 64 20 76 61 6c 75 tf("invalid valu
1b20: 65 20 5c 22 25 64 5c 22 20 66 6f 72 20 6f 70 74 e \"%d\" for opt
1b30: 69 6f 6e 20 5c 22 25 73 5c 22 3a 20 6d 75 73 74 ion \"%s\": must
1b40: 20 62 65 20 3c 3d 20 25 64 22 2c 20 2a 76 61 6c be <= %d", *val
1b50: 75 65 2c 20 6e 61 6d 65 2c 20 6d 61 78 29 29 3b ue, name, max));
1b60: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
1b70: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 OR;. }. re
1b80: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a turn TCL_OK;.}..