Hex Artifact Content

Artifact b1b9224457dde8e14c910987149e290ff86a9e53e326e27b0f5c73e844e381ab:


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;.}..