Hex Artifact Content

Artifact 2e942636f41ea4a029f4ce4ee5f8911d3493f75b139758467e11e8fd010ce622:


0000: 2f 2a 0a 20 2a 20 4b 65 79 20 44 65 72 69 76 61  /*. * Key Deriva
0010: 74 69 6f 6e 20 46 75 6e 63 74 69 6f 6e 20 28 4b  tion Function (K
0020: 44 46 29 20 4d 6f 64 75 6c 65 0a 20 2a 0a 20 2a  DF) Module. *. *
0030: 20 50 72 6f 76 69 64 65 73 20 63 6f 6d 6d 61 6e   Provides comman
0040: 64 73 20 74 6f 20 64 65 72 69 76 65 20 6b 65 79  ds to derive key
0050: 73 2e 0a 20 2a 0a 20 2a 20 43 6f 70 79 72 69 67  s.. *. * Copyrig
0060: 68 74 20 28 43 29 20 32 30 32 33 20 42 72 69 61  ht (C) 2023 Bria
0070: 6e 20 4f 27 48 61 67 61 6e 0a 20 2a 0a 20 2a 2f  n O'Hagan. *. */
0080: 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 6c 73 49  ..#include "tlsI
0090: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22  nt.h".#include "
00a0: 74 63 6c 4f 70 74 73 2e 68 22 0a 23 69 6e 63 6c  tclOpts.h".#incl
00b0: 75 64 65 20 3c 6f 70 65 6e 73 73 6c 2f 65 76 70  ude <openssl/evp
00c0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 6f 70  .h>.#include <op
00d0: 65 6e 73 73 6c 2f 6b 64 66 2e 68 3e 0a 0a 2f 2a  enssl/kdf.h>../*
00e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
00f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0100: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0110: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0120: 2a 2a 2f 0a 0a 2f 2a 20 4f 70 74 69 6f 6e 73 20  **/../* Options 
0130: 66 6f 72 20 4b 44 46 20 63 6f 6d 6d 61 6e 64 73  for KDF commands
0140: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73   */..static cons
0150: 74 20 63 68 61 72 20 2a 63 6f 6d 6d 61 6e 64 5f  t char *command_
0160: 6f 70 74 73 20 5b 5d 20 3d 20 7b 0a 20 20 20 20  opts [] = {.    
0170: 22 2d 63 69 70 68 65 72 22 2c 20 22 2d 64 69 67  "-cipher", "-dig
0180: 65 73 74 22 2c 20 22 2d 68 61 73 68 22 2c 20 22  est", "-hash", "
0190: 2d 69 6e 66 6f 22 2c 20 22 2d 69 74 65 72 61 74  -info", "-iterat
01a0: 69 6f 6e 73 22 2c 20 22 2d 6b 65 79 22 2c 20 22  ions", "-key", "
01b0: 2d 6c 65 6e 67 74 68 22 2c 20 22 2d 70 61 73 73  -length", "-pass
01c0: 77 6f 72 64 22 2c 0a 20 20 20 20 22 2d 73 61 6c  word",.    "-sal
01d0: 74 22 2c 20 22 2d 73 69 7a 65 22 2c 20 22 2d 4e  t", "-size", "-N
01e0: 22 2c 20 22 2d 6e 22 2c 20 22 2d 72 22 2c 20 22  ", "-n", "-r", "
01f0: 2d 70 22 2c 20 4e 55 4c 4c 7d 3b 0a 0a 65 6e 75  -p", NULL};..enu
0200: 6d 20 5f 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 20  m _command_opts 
0210: 7b 0a 20 20 20 20 5f 6f 70 74 5f 63 69 70 68 65  {.    _opt_ciphe
0220: 72 2c 20 5f 6f 70 74 5f 64 69 67 65 73 74 2c 20  r, _opt_digest, 
0230: 5f 6f 70 74 5f 68 61 73 68 2c 20 5f 6f 70 74 5f  _opt_hash, _opt_
0240: 69 6e 66 6f 2c 20 5f 6f 70 74 5f 69 74 65 72 2c  info, _opt_iter,
0250: 20 5f 6f 70 74 5f 6b 65 79 2c 20 5f 6f 70 74 5f   _opt_key, _opt_
0260: 6c 65 6e 67 74 68 2c 0a 20 20 20 20 5f 6f 70 74  length,.    _opt
0270: 5f 70 61 73 73 77 6f 72 64 2c 20 5f 6f 70 74 5f  _password, _opt_
0280: 73 61 6c 74 2c 20 5f 6f 70 74 5f 73 69 7a 65 2c  salt, _opt_size,
0290: 20 5f 6f 70 74 5f 4e 2c 20 5f 6f 70 74 5f 6e 2c   _opt_N, _opt_n,
02a0: 20 5f 6f 70 74 5f 72 2c 20 5f 6f 70 74 5f 70 0a   _opt_r, _opt_p.
02b0: 7d 3b 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  };../*. *-------
02c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
0300: 20 2a 20 4b 44 46 5f 50 42 4b 44 46 32 20 2d 2d   * KDF_PBKDF2 --
0310: 0a 20 2a 0a 20 2a 09 50 4b 43 53 35 5f 50 42 4b  . *. *.PKCS5_PBK
0320: 44 46 32 5f 48 4d 41 43 20 6b 65 79 20 64 65 72  DF2_HMAC key der
0330: 69 76 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e  ivation function
0340: 20 28 4b 44 46 29 20 73 70 65 63 69 66 69 65 64   (KDF) specified
0350: 20 62 79 20 50 4b 43 53 20 23 35 2e 0a 20 2a 09   by PKCS #5.. *.
0360: 4b 44 46 73 20 69 6e 63 6c 75 64 65 20 50 42 4b  KDFs include PBK
0370: 44 46 32 20 66 72 6f 6d 20 52 46 43 20 32 38 39  DF2 from RFC 289
0380: 38 2f 38 30 31 38 20 61 6e 64 20 53 63 72 79 70  8/8018 and Scryp
0390: 74 20 66 72 6f 6d 20 52 46 43 20 37 39 31 34 2e  t from RFC 7914.
03a0: 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73 3a 0a  . *. * Returns:.
03b0: 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54 43 4c   *.TCL_OK or TCL
03c0: 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53 69 64  _ERROR. *. * Sid
03d0: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65  e effects:. *.Se
03e0: 74 73 20 72 65 73 75 6c 74 20 74 6f 20 61 20 6c  ts result to a l
03f0: 69 73 74 20 6f 66 20 6b 65 79 20 61 6e 64 20 69  ist of key and i
0400: 76 20 76 61 6c 75 65 73 2c 20 6f 72 20 61 6e 20  v values, or an 
0410: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 20 2a  error message. *
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 2f 0a 73 74 61 74 69  ------. */.stati
0470: 63 20 69 6e 74 20 4b 44 46 5f 50 42 4b 44 46 32  c int KDF_PBKDF2
0480: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65  (ClientData clie
0490: 6e 74 44 61 74 61 2c 20 54 63 6c 5f 49 6e 74 65  ntData, Tcl_Inte
04a0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20  rp *interp, int 
04b0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63  objc, Tcl_Obj *c
04c0: 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 20 7b 0a 20  onst objv[]) {. 
04d0: 20 20 20 69 6e 74 20 70 61 73 73 5f 6c 65 6e 20     int pass_len 
04e0: 3d 20 30 2c 20 73 61 6c 74 5f 6c 65 6e 20 3d 20  = 0, salt_len = 
04f0: 30 2c 20 66 6e 3b 0a 20 20 20 20 69 6e 74 20 69  0, fn;.    int i
0500: 6b 6c 65 6e 2c 20 69 76 6c 65 6e 2c 20 69 74 65  klen, ivlen, ite
0510: 72 20 3d 20 31 3b 0a 20 20 20 20 75 6e 73 69 67  r = 1;.    unsig
0520: 6e 65 64 20 63 68 61 72 20 2a 70 61 73 73 20 3d  ned char *pass =
0530: 20 4e 55 4c 4c 2c 20 2a 73 61 6c 74 20 3d 20 4e   NULL, *salt = N
0540: 55 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45  ULL;.    const E
0550: 56 50 5f 4d 44 20 2a 6d 64 20 3d 20 4e 55 4c 4c  VP_MD *md = NULL
0560: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56 50 5f  ;.    const EVP_
0570: 43 49 50 48 45 52 20 2a 63 69 70 68 65 72 20 3d  CIPHER *cipher =
0580: 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20 62   NULL;.    int b
0590: 75 66 5f 6c 65 6e 20 3d 20 28 45 56 50 5f 4d 41  uf_len = (EVP_MA
05a0: 58 5f 4b 45 59 5f 4c 45 4e 47 54 48 20 2b 20 45  X_KEY_LENGTH + E
05b0: 56 50 5f 4d 41 58 5f 49 56 5f 4c 45 4e 47 54 48  VP_MAX_IV_LENGTH
05c0: 29 2a 34 2c 20 64 6b 5f 6c 65 6e 20 3d 20 62 75  )*4, dk_len = bu
05d0: 66 5f 6c 65 6e 3b 0a 20 20 20 20 75 6e 73 69 67  f_len;.    unsig
05e0: 6e 65 64 20 63 68 61 72 20 74 6d 70 6b 65 79 69  ned char tmpkeyi
05f0: 76 5b 28 45 56 50 5f 4d 41 58 5f 4b 45 59 5f 4c  v[(EVP_MAX_KEY_L
0600: 45 4e 47 54 48 20 2b 20 45 56 50 5f 4d 41 58 5f  ENGTH + EVP_MAX_
0610: 49 56 5f 4c 45 4e 47 54 48 29 2a 34 5d 3b 0a 0a  IV_LENGTH)*4];..
0620: 20 20 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c      dprintf("Cal
0630: 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 43  led");..    /* C
0640: 6c 65 61 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20  lear errors */. 
0650: 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75     Tcl_ResetResu
0660: 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
0670: 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28  ERR_clear_error(
0680: 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64  );..    /* Valid
0690: 61 74 65 20 61 72 67 20 63 6f 75 6e 74 20 2a 2f  ate arg count */
06a0: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20  .    if (objc < 
06b0: 33 20 7c 7c 20 6f 62 6a 63 20 3e 20 31 31 29 20  3 || objc > 11) 
06c0: 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  {..Tcl_WrongNumA
06d0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
06e0: 62 6a 76 2c 20 22 5b 2d 63 69 70 68 65 72 20 63  bjv, "[-cipher c
06f0: 69 70 68 65 72 20 7c 20 2d 73 69 7a 65 20 6c 65  ipher | -size le
0700: 6e 67 74 68 5d 20 2d 64 69 67 65 73 74 20 64 69  ngth] -digest di
0710: 67 65 73 74 20 3f 2d 69 74 65 72 61 74 69 6f 6e  gest ?-iteration
0720: 73 20 63 6f 75 6e 74 3f 20 3f 2d 70 61 73 73 77  s count? ?-passw
0730: 6f 72 64 20 73 74 72 69 6e 67 3f 20 3f 2d 73 61  ord string? ?-sa
0740: 6c 74 20 73 74 72 69 6e 67 3f 22 29 3b 0a 09 72  lt string?");..r
0750: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
0760: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
0770: 6e 69 74 20 62 75 66 66 65 72 73 20 2a 2f 0a 20  nit buffers */. 
0780: 20 20 20 6d 65 6d 73 65 74 28 74 6d 70 6b 65 79     memset(tmpkey
0790: 69 76 2c 20 30 2c 20 62 75 66 5f 6c 65 6e 29 3b  iv, 0, buf_len);
07a0: 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 6f 70 74  ..    /* Get opt
07b0: 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 66 6f 72 20  ions */.    for 
07c0: 28 69 6e 74 20 69 64 78 20 3d 20 31 3b 20 69 64  (int idx = 1; id
07d0: 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78 2b 2b 29  x < objc; idx++)
07e0: 20 7b 0a 09 2f 2a 20 47 65 74 20 6f 70 74 69 6f   {../* Get optio
07f0: 6e 20 2a 2f 0a 09 69 66 20 28 54 63 6c 5f 47 65  n */..if (Tcl_Ge
0800: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
0810: 74 65 72 70 2c 20 6f 62 6a 76 5b 69 64 78 5d 2c  terp, objv[idx],
0820: 20 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 2c 20 22   command_opts, "
0830: 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26 66 6e 29  option", 0, &fn)
0840: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20   != TCL_OK) {.. 
0850: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
0860: 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20 56 61 6c  ROR;..}.../* Val
0870: 69 64 61 74 65 20 61 72 67 20 68 61 73 20 61 20  idate arg has a 
0880: 76 61 6c 75 65 20 2a 2f 0a 09 69 66 20 28 2b 2b  value */..if (++
0890: 69 64 78 20 3e 3d 20 6f 62 6a 63 29 20 7b 0a 09  idx >= objc) {..
08a0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
08b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 6f  sult(interp, "No
08c0: 20 76 61 6c 75 65 20 66 6f 72 20 6f 70 74 69 6f   value for optio
08d0: 6e 20 5c 22 22 2c 20 63 6f 6d 6d 61 6e 64 5f 6f  n \"", command_o
08e0: 70 74 73 5b 66 6e 5d 2c 20 22 5c 22 22 2c 20 4e  pts[fn], "\"", N
08f0: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72  ULL);..    retur
0900: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a  n TCL_ERROR;..}.
0910: 0a 09 73 77 69 74 63 68 28 66 6e 29 20 7b 0a 09  ..switch(fn) {..
0920: 63 61 73 65 20 5f 6f 70 74 5f 63 69 70 68 65 72  case _opt_cipher
0930: 3a 0a 09 20 20 20 20 69 66 20 28 28 63 69 70 68  :..    if ((ciph
0940: 65 72 20 3d 20 55 74 69 6c 5f 47 65 74 43 69 70  er = Util_GetCip
0950: 68 65 72 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  her(interp, objv
0960: 5b 69 64 78 5d 2c 20 54 52 55 45 29 29 20 3d 3d  [idx], TRUE)) ==
0970: 20 4e 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72   NULL) {...retur
0980: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20  n TCL_ERROR;..  
0990: 20 20 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a    }..    break;.
09a0: 09 63 61 73 65 20 5f 6f 70 74 5f 64 69 67 65 73  .case _opt_diges
09b0: 74 3a 0a 09 63 61 73 65 20 5f 6f 70 74 5f 68 61  t:..case _opt_ha
09c0: 73 68 3a 0a 09 20 20 20 20 69 66 20 28 28 6d 64  sh:..    if ((md
09d0: 20 3d 20 55 74 69 6c 5f 47 65 74 44 69 67 65 73   = Util_GetDiges
09e0: 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69  t(interp, objv[i
09f0: 64 78 5d 2c 20 54 52 55 45 29 29 20 3d 3d 20 4e  dx], TRUE)) == N
0a00: 55 4c 4c 29 20 7b 0a 09 09 72 65 74 75 72 6e 20  ULL) {...return 
0a10: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20  TCL_ERROR;..    
0a20: 7d 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63  }..    break;..c
0a30: 61 73 65 20 5f 6f 70 74 5f 69 74 65 72 3a 0a 09  ase _opt_iter:..
0a40: 20 20 20 20 69 66 20 28 55 74 69 6c 5f 47 65 74      if (Util_Get
0a50: 49 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Int(interp, objv
0a60: 5b 69 64 78 5d 2c 20 26 69 74 65 72 2c 20 22 69  [idx], &iter, "i
0a70: 74 65 72 61 74 69 6f 6e 73 22 2c 20 31 2c 20 2d  terations", 1, -
0a80: 31 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  1) != TCL_OK) {.
0a90: 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
0aa0: 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  OR;..    }..    
0ab0: 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70  break;..case _op
0ac0: 74 5f 6b 65 79 3a 0a 09 63 61 73 65 20 5f 6f 70  t_key:..case _op
0ad0: 74 5f 70 61 73 73 77 6f 72 64 3a 0a 09 20 20 20  t_password:..   
0ae0: 20 70 61 73 73 20 3d 20 55 74 69 6c 5f 47 65 74   pass = Util_Get
0af0: 4b 65 79 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Key(interp, objv
0b00: 5b 69 64 78 5d 2c 20 26 70 61 73 73 5f 6c 65 6e  [idx], &pass_len
0b10: 2c 20 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 5b 66  , command_opts[f
0b20: 6e 5d 2c 20 30 2c 20 46 41 4c 53 45 29 3b 0a 09  n], 0, FALSE);..
0b30: 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65      break;..case
0b40: 20 5f 6f 70 74 5f 73 61 6c 74 3a 0a 09 20 20 20   _opt_salt:..   
0b50: 20 47 45 54 5f 4f 50 54 5f 42 59 54 45 5f 41 52   GET_OPT_BYTE_AR
0b60: 52 41 59 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 73  RAY(objv[idx], s
0b70: 61 6c 74 2c 20 26 73 61 6c 74 5f 6c 65 6e 29 3b  alt, &salt_len);
0b80: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61  ..    break;..ca
0b90: 73 65 20 5f 6f 70 74 5f 6c 65 6e 67 74 68 3a 0a  se _opt_length:.
0ba0: 09 63 61 73 65 20 5f 6f 70 74 5f 73 69 7a 65 3a  .case _opt_size:
0bb0: 0a 09 20 20 20 20 69 66 20 28 55 74 69 6c 5f 47  ..    if (Util_G
0bc0: 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62  etInt(interp, ob
0bd0: 6a 76 5b 69 64 78 5d 2c 20 26 64 6b 5f 6c 65 6e  jv[idx], &dk_len
0be0: 2c 20 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 5b 66  , command_opts[f
0bf0: 6e 5d 2c 20 31 2c 20 62 75 66 5f 6c 65 6e 29 20  n], 1, buf_len) 
0c00: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 72  != TCL_OK) {...r
0c10: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
0c20: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62 72 65  ..    }..    bre
0c30: 61 6b 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  ak;..}.    }..  
0c40: 20 20 2f 2a 20 56 61 6c 69 64 61 74 65 20 6f 70    /* Validate op
0c50: 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 69 66 20  tions */.    if 
0c60: 28 6d 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09  (md == NULL) {..
0c70: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
0c80: 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 64 69 67  (interp, "no dig
0c90: 65 73 74 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65  est", NULL);..re
0ca0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
0cb0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65      }..    /* Se
0cc0: 74 20 6f 75 74 70 75 74 20 74 79 70 65 20 73 69  t output type si
0cd0: 7a 65 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 63  zes */.    if (c
0ce0: 69 70 68 65 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ipher == NULL) {
0cf0: 0a 09 69 66 20 28 64 6b 5f 6c 65 6e 20 3e 20 62  ..if (dk_len > b
0d00: 75 66 5f 6c 65 6e 29 20 64 6b 5f 6c 65 6e 20 3d  uf_len) dk_len =
0d10: 20 62 75 66 5f 6c 65 6e 3b 0a 09 69 6b 6c 65 6e   buf_len;..iklen
0d20: 20 3d 20 64 6b 5f 6c 65 6e 3b 0a 09 69 76 6c 65   = dk_len;..ivle
0d30: 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 20 65 6c 73  n = 0;.    } els
0d40: 65 20 7b 0a 09 69 6b 6c 65 6e 20 3d 20 45 56 50  e {..iklen = EVP
0d50: 5f 43 49 50 48 45 52 5f 6b 65 79 5f 6c 65 6e 67  _CIPHER_key_leng
0d60: 74 68 28 63 69 70 68 65 72 29 3b 0a 09 69 76 6c  th(cipher);..ivl
0d70: 65 6e 20 3d 20 45 56 50 5f 43 49 50 48 45 52 5f  en = EVP_CIPHER_
0d80: 69 76 5f 6c 65 6e 67 74 68 28 63 69 70 68 65 72  iv_length(cipher
0d90: 29 3b 0a 09 64 6b 5f 6c 65 6e 20 3d 20 69 6b 6c  );..dk_len = ikl
0da0: 65 6e 2b 69 76 6c 65 6e 3b 0a 20 20 20 20 7d 0a  en+ivlen;.    }.
0db0: 0a 20 20 20 20 2f 2a 20 44 65 72 69 76 65 20 6b  .    /* Derive k
0dc0: 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28 21 50  ey */.    if (!P
0dd0: 4b 43 53 35 5f 50 42 4b 44 46 32 5f 48 4d 41 43  KCS5_PBKDF2_HMAC
0de0: 28 70 61 73 73 2c 20 70 61 73 73 5f 6c 65 6e 2c  (pass, pass_len,
0df0: 20 73 61 6c 74 2c 20 73 61 6c 74 5f 6c 65 6e 2c   salt, salt_len,
0e00: 20 69 74 65 72 2c 20 6d 64 2c 20 64 6b 5f 6c 65   iter, md, dk_le
0e10: 6e 2c 20 74 6d 70 6b 65 79 69 76 29 29 20 7b 0a  n, tmpkeyiv)) {.
0e20: 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c  .Tcl_AppendResul
0e30: 74 28 69 6e 74 65 72 70 2c 20 22 4b 65 79 20 64  t(interp, "Key d
0e40: 65 72 69 76 61 74 69 6f 6e 20 66 61 69 6c 65 64  erivation failed
0e50: 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e  : ", REASON(), N
0e60: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  ULL);..return TC
0e70: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a  L_ERROR;.    }..
0e80: 20 20 20 2f 2a 20 53 65 74 20 72 65 73 75 6c 74     /* Set result
0e90: 20 74 6f 20 6b 65 79 20 61 6e 64 20 69 76 20 2a   to key and iv *
0ea0: 2f 0a 20 20 20 20 69 66 20 28 63 69 70 68 65 72  /.    if (cipher
0eb0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c   == NULL) {..Tcl
0ec0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
0ed0: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74  terp, Tcl_NewByt
0ee0: 65 41 72 72 61 79 4f 62 6a 28 74 6d 70 6b 65 79  eArrayObj(tmpkey
0ef0: 69 76 2c 20 64 6b 5f 6c 65 6e 29 29 3b 0a 20 20  iv, dk_len));.  
0f00: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f    } else {..Tcl_
0f10: 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 20 3d  Obj *resultObj =
0f20: 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28   Tcl_NewListObj(
0f30: 30 2c 20 4e 55 4c 4c 29 3b 0a 09 4c 41 50 50 45  0, NULL);..LAPPE
0f40: 4e 44 5f 42 41 52 52 41 59 28 69 6e 74 65 72 70  ND_BARRAY(interp
0f50: 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 22 6b 65  , resultObj, "ke
0f60: 79 22 2c 20 74 6d 70 6b 65 79 69 76 2c 20 69 6b  y", tmpkeyiv, ik
0f70: 6c 65 6e 29 3b 0a 09 4c 41 50 50 45 4e 44 5f 42  len);..LAPPEND_B
0f80: 41 52 52 41 59 28 69 6e 74 65 72 70 2c 20 72 65  ARRAY(interp, re
0f90: 73 75 6c 74 4f 62 6a 2c 20 22 69 76 22 2c 20 74  sultObj, "iv", t
0fa0: 6d 70 6b 65 79 69 76 2b 69 6b 6c 65 6e 2c 20 69  mpkeyiv+iklen, i
0fb0: 76 6c 65 6e 29 3b 0a 09 54 63 6c 5f 53 65 74 4f  vlen);..Tcl_SetO
0fc0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
0fd0: 20 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 20 20 20   resultObj);.   
0fe0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6c 65 61 72   }..    /* Clear
0ff0: 20 64 61 74 61 20 2a 2f 0a 20 20 20 20 6d 65 6d   data */.    mem
1000: 73 65 74 28 74 6d 70 6b 65 79 69 76 2c 20 30 2c  set(tmpkeyiv, 0,
1010: 20 62 75 66 5f 6c 65 6e 29 3b 0a 20 20 20 20 72   buf_len);.    r
1020: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 63  eturn TCL_OK;..c
1030: 6c 69 65 6e 74 44 61 74 61 20 3d 20 63 6c 69 65  lientData = clie
1040: 6e 74 44 61 74 61 3b 0a 7d 0a 0a 2f 2a 0a 20 2a  ntData;.}../*. *
1050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1090: 2d 2d 2d 0a 20 2a 0a 20 2a 20 4b 44 46 5f 48 4b  ---. *. * KDF_HK
10a0: 44 46 20 2d 2d 0a 20 2a 0a 20 2a 09 48 4d 41 43  DF --. *. *.HMAC
10b0: 2d 62 61 73 65 64 20 45 78 74 72 61 63 74 2d 61  -based Extract-a
10c0: 6e 64 2d 45 78 70 61 6e 64 20 4b 65 79 20 44 65  nd-Expand Key De
10d0: 72 69 76 61 74 69 6f 6e 20 46 75 6e 63 74 69 6f  rivation Functio
10e0: 6e 20 28 48 4b 44 46 29 2e 0a 20 2a 09 53 65 65  n (HKDF).. *.See
10f0: 20 52 46 43 20 35 38 36 39 2e 0a 20 2a 0a 20 2a   RFC 5869.. *. *
1100: 20 52 65 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c   Returns:. *.TCL
1110: 5f 4f 4b 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52  _OK or TCL_ERROR
1120: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
1130: 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 72 65 73  cts:. *.Sets res
1140: 75 6c 74 20 74 6f 20 61 20 6b 65 79 20 6f 66 20  ult to a key of 
1150: 73 70 65 63 69 66 69 65 64 20 6c 65 6e 67 74 68  specified length
1160: 2c 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6d 65  , or an error me
1170: 73 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  ssage. *. *-----
1180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
11c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 4b 44  */.static int KD
11d0: 46 5f 48 4b 44 46 28 43 6c 69 65 6e 74 44 61 74  F_HKDF(ClientDat
11e0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54 63  a clientData, Tc
11f0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1200: 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f  , int objc, Tcl_
1210: 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b  Obj *const objv[
1220: 5d 29 20 7b 0a 20 20 20 20 45 56 50 5f 50 4b 45  ]) {.    EVP_PKE
1230: 59 5f 43 54 58 20 2a 70 63 74 78 20 3d 20 4e 55  Y_CTX *pctx = NU
1240: 4c 4c 3b 0a 20 20 20 20 63 6f 6e 73 74 20 45 56  LL;.    const EV
1250: 50 5f 4d 44 20 2a 6d 64 20 3d 20 4e 55 4c 4c 3b  P_MD *md = NULL;
1260: 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68  .    unsigned ch
1270: 61 72 20 2a 73 61 6c 74 20 3d 20 4e 55 4c 4c 2c  ar *salt = NULL,
1280: 20 2a 6b 65 79 20 3d 20 4e 55 4c 4c 2c 20 2a 69   *key = NULL, *i
1290: 6e 66 6f 20 3d 20 4e 55 4c 4c 2c 20 2a 6f 75 74  nfo = NULL, *out
12a0: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74   = NULL;.    int
12b0: 20 73 61 6c 74 5f 6c 65 6e 20 3d 20 30 2c 20 6b   salt_len = 0, k
12c0: 65 79 5f 6c 65 6e 20 3d 20 30 2c 20 69 6e 66 6f  ey_len = 0, info
12d0: 5f 6c 65 6e 20 3d 20 30 2c 20 72 65 73 20 3d 20  _len = 0, res = 
12e0: 54 43 4c 5f 4f 4b 2c 20 66 6e 3b 0a 20 20 20 20  TCL_OK, fn;.    
12f0: 69 6e 74 20 64 6b 5f 6c 65 6e 20 3d 20 45 56 50  int dk_len = EVP
1300: 5f 4d 41 58 5f 4b 45 59 5f 4c 45 4e 47 54 48 20  _MAX_KEY_LENGTH 
1310: 2b 20 45 56 50 5f 4d 41 58 5f 49 56 5f 4c 45 4e  + EVP_MAX_IV_LEN
1320: 47 54 48 3b 0a 20 20 20 20 73 69 7a 65 5f 74 20  GTH;.    size_t 
1330: 6f 75 74 5f 6c 65 6e 3b 0a 20 20 20 20 54 63 6c  out_len;.    Tcl
1340: 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 3b  _Obj *resultObj;
1350: 0a 0a 20 20 20 20 64 70 72 69 6e 74 66 28 22 43  ..    dprintf("C
1360: 61 6c 6c 65 64 22 29 3b 0a 0a 20 20 20 20 2f 2a  alled");..    /*
1370: 20 43 6c 65 61 72 20 65 72 72 6f 72 73 20 2a 2f   Clear errors */
1380: 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65  .    Tcl_ResetRe
1390: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
13a0: 20 20 45 52 52 5f 63 6c 65 61 72 5f 65 72 72 6f    ERR_clear_erro
13b0: 72 28 29 3b 0a 0a 20 20 20 20 2f 2a 20 56 61 6c  r();..    /* Val
13c0: 69 64 61 74 65 20 61 72 67 20 63 6f 75 6e 74 20  idate arg count 
13d0: 2a 2f 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  */.    if (objc 
13e0: 3c 20 35 20 7c 7c 20 6f 62 6a 63 20 3e 20 31 31  < 5 || objc > 11
13f0: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75  ) {..Tcl_WrongNu
1400: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1410: 20 6f 62 6a 76 2c 20 22 2d 64 69 67 65 73 74 20   objv, "-digest 
1420: 64 69 67 65 73 74 20 2d 6b 65 79 20 73 74 72 69  digest -key stri
1430: 6e 67 20 3f 2d 69 6e 66 6f 20 73 74 72 69 6e 67  ng ?-info string
1440: 3f 20 3f 2d 73 61 6c 74 20 73 74 72 69 6e 67 3f  ? ?-salt string?
1450: 20 3f 2d 73 69 7a 65 20 64 65 72 69 76 65 64 5f   ?-size derived_
1460: 6c 65 6e 67 74 68 3f 22 29 3b 0a 09 72 65 74 75  length?");..retu
1470: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1480: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20    }..    /* Get 
1490: 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 66  options */.    f
14a0: 6f 72 20 28 69 6e 74 20 69 64 78 20 3d 20 31 3b  or (int idx = 1;
14b0: 20 69 64 78 20 3c 20 6f 62 6a 63 3b 20 69 64 78   idx < objc; idx
14c0: 2b 2b 29 20 7b 0a 09 2f 2a 20 47 65 74 20 6f 70  ++) {../* Get op
14d0: 74 69 6f 6e 20 2a 2f 0a 09 69 66 20 28 54 63 6c  tion */..if (Tcl
14e0: 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
14f0: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 64  (interp, objv[id
1500: 78 5d 2c 20 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73  x], command_opts
1510: 2c 20 22 6f 70 74 69 6f 6e 22 2c 20 30 2c 20 26  , "option", 0, &
1520: 66 6e 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  fn) != TCL_OK) {
1530: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
1540: 5f 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 2f 2a 20  _ERROR;..}.../* 
1550: 56 61 6c 69 64 61 74 65 20 61 72 67 20 68 61 73  Validate arg has
1560: 20 61 20 76 61 6c 75 65 20 2a 2f 0a 09 69 66 20   a value */..if 
1570: 28 2b 2b 69 64 78 20 3e 3d 20 6f 62 6a 63 29 20  (++idx >= objc) 
1580: 7b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  {..    Tcl_Appen
1590: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
15a0: 22 4e 6f 20 76 61 6c 75 65 20 66 6f 72 20 6f 70  "No value for op
15b0: 74 69 6f 6e 20 5c 22 22 2c 20 63 6f 6d 6d 61 6e  tion \"", comman
15c0: 64 5f 6f 70 74 73 5b 66 6e 5d 2c 20 22 5c 22 22  d_opts[fn], "\""
15d0: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65  , NULL);..    re
15e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15f0: 09 7d 0a 0a 09 73 77 69 74 63 68 28 66 6e 29 20  .}...switch(fn) 
1600: 7b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 64 69 67  {..case _opt_dig
1610: 65 73 74 3a 0a 09 63 61 73 65 20 5f 6f 70 74 5f  est:..case _opt_
1620: 68 61 73 68 3a 0a 09 20 20 20 20 69 66 20 28 28  hash:..    if ((
1630: 6d 64 20 3d 20 55 74 69 6c 5f 47 65 74 44 69 67  md = Util_GetDig
1640: 65 73 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  est(interp, objv
1650: 5b 69 64 78 5d 2c 20 54 52 55 45 29 29 20 3d 3d  [idx], TRUE)) ==
1660: 20 4e 55 4c 4c 29 20 7b 0a 09 09 67 6f 74 6f 20   NULL) {...goto 
1670: 65 72 72 6f 72 3b 0a 09 20 20 20 20 7d 0a 09 20  error;..    }.. 
1680: 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20     break;..case 
1690: 5f 6f 70 74 5f 69 6e 66 6f 3a 0a 09 20 20 20 20  _opt_info:..    
16a0: 2f 2a 20 4d 61 78 20 31 30 32 34 2f 32 30 34 38  /* Max 1024/2048
16b0: 20 2a 2f 0a 09 20 20 20 20 47 45 54 5f 4f 50 54   */..    GET_OPT
16c0: 5f 42 59 54 45 5f 41 52 52 41 59 28 6f 62 6a 76  _BYTE_ARRAY(objv
16d0: 5b 69 64 78 5d 2c 20 69 6e 66 6f 2c 20 26 69 6e  [idx], info, &in
16e0: 66 6f 5f 6c 65 6e 29 3b 0a 09 20 20 20 20 62 72  fo_len);..    br
16f0: 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74 5f  eak;..case _opt_
1700: 6b 65 79 3a 0a 09 63 61 73 65 20 5f 6f 70 74 5f  key:..case _opt_
1710: 70 61 73 73 77 6f 72 64 3a 0a 09 20 20 20 20 69  password:..    i
1720: 66 20 28 28 6b 65 79 20 3d 20 55 74 69 6c 5f 47  f ((key = Util_G
1730: 65 74 4b 65 79 28 69 6e 74 65 72 70 2c 20 6f 62  etKey(interp, ob
1740: 6a 76 5b 69 64 78 5d 2c 20 26 6b 65 79 5f 6c 65  jv[idx], &key_le
1750: 6e 2c 20 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 5b  n, command_opts[
1760: 66 6e 5d 2c 20 30 2c 20 31 29 29 20 3d 3d 20 4e  fn], 0, 1)) == N
1770: 55 4c 4c 29 20 7b 0a 09 09 67 6f 74 6f 20 65 72  ULL) {...goto er
1780: 72 6f 72 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  ror;..    }..   
1790: 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f   break;..case _o
17a0: 70 74 5f 73 61 6c 74 3a 0a 09 20 20 20 20 47 45  pt_salt:..    GE
17b0: 54 5f 4f 50 54 5f 42 59 54 45 5f 41 52 52 41 59  T_OPT_BYTE_ARRAY
17c0: 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 73 61 6c 74  (objv[idx], salt
17d0: 2c 20 26 73 61 6c 74 5f 6c 65 6e 29 3b 0a 09 20  , &salt_len);.. 
17e0: 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20     break;..case 
17f0: 5f 6f 70 74 5f 6c 65 6e 67 74 68 3a 0a 09 63 61  _opt_length:..ca
1800: 73 65 20 5f 6f 70 74 5f 73 69 7a 65 3a 0a 09 20  se _opt_size:.. 
1810: 20 20 20 69 66 20 28 55 74 69 6c 5f 47 65 74 49     if (Util_GetI
1820: 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  nt(interp, objv[
1830: 69 64 78 5d 2c 20 26 64 6b 5f 6c 65 6e 2c 20 63  idx], &dk_len, c
1840: 6f 6d 6d 61 6e 64 5f 6f 70 74 73 5b 66 6e 5d 2c  ommand_opts[fn],
1850: 20 31 2c 20 30 29 20 21 3d 20 54 43 4c 5f 4f 4b   1, 0) != TCL_OK
1860: 29 20 7b 0a 09 09 67 6f 74 6f 20 65 72 72 6f 72  ) {...goto error
1870: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62 72  ;..    }..    br
1880: 65 61 6b 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  eak;..}.    }.. 
1890: 20 20 20 69 66 20 28 6d 64 20 3d 3d 20 4e 55 4c     if (md == NUL
18a0: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  L) {..Tcl_Append
18b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
18c0: 6e 6f 20 64 69 67 65 73 74 22 2c 20 4e 55 4c 4c  no digest", NULL
18d0: 29 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a  );..goto error;.
18e0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 6b      }..    if (k
18f0: 65 79 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54  ey == NULL) {..T
1900: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1910: 69 6e 74 65 72 70 2c 20 22 6e 6f 20 6b 65 79 22  interp, "no key"
1920: 2c 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65  , NULL);..goto e
1930: 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rror;.    }..   
1940: 20 2f 2a 20 43 72 65 61 74 65 20 63 6f 6e 74 65   /* Create conte
1950: 78 74 20 2a 2f 0a 20 20 20 20 70 63 74 78 20 3d  xt */.    pctx =
1960: 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 6e 65   EVP_PKEY_CTX_ne
1970: 77 5f 69 64 28 45 56 50 5f 50 4b 45 59 5f 48 4b  w_id(EVP_PKEY_HK
1980: 44 46 2c 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 69  DF, NULL);.    i
1990: 66 20 28 70 63 74 78 20 3d 3d 20 4e 55 4c 4c 29  f (pctx == NULL)
19a0: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65   {..Tcl_AppendRe
19b0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4d 65  sult(interp, "Me
19c0: 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
19d0: 65 72 72 6f 72 22 2c 20 4e 55 4c 4c 29 3b 0a 09  error", NULL);..
19e0: 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20  goto error;.    
19f0: 7d 0a 0a 20 20 20 20 69 66 20 28 45 56 50 5f 50  }..    if (EVP_P
1a00: 4b 45 59 5f 64 65 72 69 76 65 5f 69 6e 69 74 28  KEY_derive_init(
1a10: 70 63 74 78 29 20 3c 20 31 29 20 7b 0a 09 54 63  pctx) < 1) {..Tc
1a20: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1a30: 6e 74 65 72 70 2c 20 22 49 6e 69 74 69 61 6c 69  nterp, "Initiali
1a40: 7a 65 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45  ze failed: ", RE
1a50: 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09  ASON(), NULL);..
1a60: 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20  goto error;.    
1a70: 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 63 6f  }..    /* Set co
1a80: 6e 66 69 67 20 70 61 72 61 6d 65 74 65 72 73 20  nfig parameters 
1a90: 2a 2f 0a 20 20 20 20 69 66 20 28 45 56 50 5f 50  */.    if (EVP_P
1aa0: 4b 45 59 5f 43 54 58 5f 73 65 74 5f 68 6b 64 66  KEY_CTX_set_hkdf
1ab0: 5f 6d 64 28 70 63 74 78 2c 20 6d 64 29 20 3c 20  _md(pctx, md) < 
1ac0: 31 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  1) {..Tcl_Append
1ad0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1ae0: 53 65 74 20 64 69 67 65 73 74 20 66 61 69 6c 65  Set digest faile
1af0: 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20  d: ", REASON(), 
1b00: 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72  NULL);..goto err
1b10: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  or;.    }.    if
1b20: 20 28 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73   (EVP_PKEY_CTX_s
1b30: 65 74 31 5f 68 6b 64 66 5f 6b 65 79 28 70 63 74  et1_hkdf_key(pct
1b40: 78 2c 20 6b 65 79 2c 20 6b 65 79 5f 6c 65 6e 29  x, key, key_len)
1b50: 20 3c 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70 70   < 1) {..Tcl_App
1b60: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1b70: 2c 20 22 53 65 74 20 6b 65 79 20 66 61 69 6c 65  , "Set key faile
1b80: 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20  d: ", REASON(), 
1b90: 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72  NULL);..goto err
1ba0: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  or;.    }.    if
1bb0: 20 28 73 61 6c 74 20 21 3d 20 4e 55 4c 4c 20 26   (salt != NULL &
1bc0: 26 20 45 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73  & EVP_PKEY_CTX_s
1bd0: 65 74 31 5f 68 6b 64 66 5f 73 61 6c 74 28 70 63  et1_hkdf_salt(pc
1be0: 74 78 2c 20 73 61 6c 74 2c 20 73 61 6c 74 5f 6c  tx, salt, salt_l
1bf0: 65 6e 29 20 3c 20 31 29 20 7b 0a 09 54 63 6c 5f  en) < 1) {..Tcl_
1c00: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1c10: 65 72 70 2c 20 22 53 65 74 20 73 61 6c 74 20 66  erp, "Set salt f
1c20: 61 69 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e  ailed: ", REASON
1c30: 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f  (), NULL);..goto
1c40: 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20   error;.    }.  
1c50: 20 20 69 66 20 28 69 6e 66 6f 20 21 3d 20 4e 55    if (info != NU
1c60: 4c 4c 20 26 26 20 45 56 50 5f 50 4b 45 59 5f 43  LL && EVP_PKEY_C
1c70: 54 58 5f 61 64 64 31 5f 68 6b 64 66 5f 69 6e 66  TX_add1_hkdf_inf
1c80: 6f 28 70 63 74 78 2c 20 69 6e 66 6f 2c 20 69 6e  o(pctx, info, in
1c90: 66 6f 5f 6c 65 6e 29 20 3c 20 31 29 20 7b 0a 09  fo_len) < 1) {..
1ca0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1cb0: 28 69 6e 74 65 72 70 2c 20 22 53 65 74 20 69 6e  (interp, "Set in
1cc0: 66 6f 20 66 61 69 6c 65 64 3a 20 22 2c 20 52 45  fo failed: ", RE
1cd0: 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a 09  ASON(), NULL);..
1ce0: 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20 20  goto error;.    
1cf0: 7d 0a 0a 20 20 20 20 2f 2a 20 47 65 74 20 62 75  }..    /* Get bu
1d00: 66 66 65 72 20 2a 2f 0a 20 20 20 20 72 65 73 75  ffer */.    resu
1d10: 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f  ltObj = Tcl_NewO
1d20: 62 6a 28 29 3b 0a 20 20 20 20 69 66 20 28 28 6f  bj();.    if ((o
1d30: 75 74 20 3d 20 54 63 6c 5f 53 65 74 42 79 74 65  ut = Tcl_SetByte
1d40: 41 72 72 61 79 4c 65 6e 67 74 68 28 72 65 73 75  ArrayLength(resu
1d50: 6c 74 4f 62 6a 2c 20 64 6b 5f 6c 65 6e 29 29 20  ltObj, dk_len)) 
1d60: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f  == NULL) {..Tcl_
1d70: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1d80: 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20 61 6c 6c  erp, "Memory all
1d90: 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c 20  ocation error", 
1da0: 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b 0a  (char *) NULL);.
1db0: 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20  .goto error;.   
1dc0: 20 7d 0a 20 20 20 20 6f 75 74 5f 6c 65 6e 20 3d   }.    out_len =
1dd0: 20 28 73 69 7a 65 5f 74 29 20 64 6b 5f 6c 65 6e   (size_t) dk_len
1de0: 3b 0a 0a 20 20 20 20 2f 2a 20 44 65 72 69 76 65  ;..    /* Derive
1df0: 20 6b 65 79 20 2a 2f 0a 20 20 20 20 69 66 20 28   key */.    if (
1e00: 45 56 50 5f 50 4b 45 59 5f 64 65 72 69 76 65 28  EVP_PKEY_derive(
1e10: 70 63 74 78 2c 20 6f 75 74 2c 20 26 6f 75 74 5f  pctx, out, &out_
1e20: 6c 65 6e 29 20 3e 20 30 29 20 7b 0a 09 2f 2a 20  len) > 0) {../* 
1e30: 53 68 72 69 6e 6b 20 62 75 66 66 65 72 20 74 6f  Shrink buffer to
1e40: 20 61 63 74 75 61 6c 20 73 69 7a 65 20 2a 2f 0a   actual size */.
1e50: 09 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61  .Tcl_SetByteArra
1e60: 79 4c 65 6e 67 74 68 28 72 65 73 75 6c 74 4f 62  yLength(resultOb
1e70: 6a 2c 20 28 69 6e 74 29 20 6f 75 74 5f 6c 65 6e  j, (int) out_len
1e80: 29 3b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65  );..Tcl_SetObjRe
1e90: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 73  sult(interp, res
1ea0: 75 6c 74 4f 62 6a 29 3b 0a 09 72 65 73 20 3d 20  ultObj);..res = 
1eb0: 54 43 4c 5f 4f 4b 3b 0a 09 67 6f 74 6f 20 64 6f  TCL_OK;..goto do
1ec0: 6e 65 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ne;.    } else {
1ed0: 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75  ..Tcl_AppendResu
1ee0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 4b 65 79 20  lt(interp, "Key 
1ef0: 64 65 72 69 76 61 74 69 6f 6e 20 66 61 69 6c 65  derivation faile
1f00: 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20  d: ", REASON(), 
1f10: 4e 55 4c 4c 29 3b 0a 09 54 63 6c 5f 44 65 63 72  NULL);..Tcl_Decr
1f20: 52 65 66 43 6f 75 6e 74 28 72 65 73 75 6c 74 4f  RefCount(resultO
1f30: 62 6a 29 3b 0a 20 20 20 20 7d 0a 0a 65 72 72 6f  bj);.    }..erro
1f40: 72 3a 0a 20 20 20 20 72 65 73 20 3d 20 54 43 4c  r:.    res = TCL
1f50: 5f 45 52 52 4f 52 3b 0a 64 6f 6e 65 3a 0a 20 20  _ERROR;.done:.  
1f60: 20 20 69 66 20 28 70 63 74 78 20 21 3d 20 4e 55    if (pctx != NU
1f70: 4c 4c 29 20 7b 0a 09 45 56 50 5f 50 4b 45 59 5f  LL) {..EVP_PKEY_
1f80: 43 54 58 5f 66 72 65 65 28 70 63 74 78 29 3b 0a  CTX_free(pctx);.
1f90: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
1fa0: 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d   res;.}../*. *--
1fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1ff0: 2d 0a 20 2a 0a 20 2a 20 4b 44 46 5f 53 63 72 79  -. *. * KDF_Scry
2000: 70 74 20 2d 2d 0a 20 2a 0a 20 2a 09 48 4d 41 43  pt --. *. *.HMAC
2010: 2d 62 61 73 65 64 20 45 78 74 72 61 63 74 2d 61  -based Extract-a
2020: 6e 64 2d 45 78 70 61 6e 64 20 4b 65 79 20 44 65  nd-Expand Key De
2030: 72 69 76 61 74 69 6f 6e 20 46 75 6e 63 74 69 6f  rivation Functio
2040: 6e 20 28 48 4b 44 46 29 2e 0a 20 2a 09 53 65 65  n (HKDF).. *.See
2050: 20 52 46 43 20 35 38 36 39 20 61 6e 64 20 52 46   RFC 5869 and RF
2060: 43 20 37 39 31 34 2e 0a 20 2a 0a 20 2a 20 52 65  C 7914.. *. * Re
2070: 74 75 72 6e 73 3a 0a 20 2a 09 54 43 4c 5f 4f 4b  turns:. *.TCL_OK
2080: 20 6f 72 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a   or TCL_ERROR. *
2090: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73  . * Side effects
20a0: 3a 0a 20 2a 09 53 65 74 73 20 72 65 73 75 6c 74  :. *.Sets result
20b0: 20 74 6f 20 61 20 6c 69 73 74 20 6f 66 20 6b 65   to a list of ke
20c0: 79 20 61 6e 64 20 69 76 20 76 61 6c 75 65 73 2c  y and iv values,
20d0: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6d 65 73   or an error mes
20e0: 73 61 67 65 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  sage. *. *------
20f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
2130: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 4b 44 46  /.static int KDF
2140: 5f 53 63 72 79 70 74 28 43 6c 69 65 6e 74 44 61  _Scrypt(ClientDa
2150: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 54  ta clientData, T
2160: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2170: 70 2c 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c  p, int objc, Tcl
2180: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76  _Obj *const objv
2190: 5b 5d 29 20 7b 0a 20 20 20 20 45 56 50 5f 50 4b  []) {.    EVP_PK
21a0: 45 59 5f 43 54 58 20 2a 70 63 74 78 20 3d 20 4e  EY_CTX *pctx = N
21b0: 55 4c 4c 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  ULL;.    unsigne
21c0: 64 20 63 68 61 72 20 2a 73 61 6c 74 20 3d 20 4e  d char *salt = N
21d0: 55 4c 4c 2c 20 2a 70 61 73 73 20 3d 20 4e 55 4c  ULL, *pass = NUL
21e0: 4c 2c 20 2a 6f 75 74 20 3d 20 4e 55 4c 4c 3b 0a  L, *out = NULL;.
21f0: 20 20 20 20 69 6e 74 20 73 61 6c 74 5f 6c 65 6e      int salt_len
2200: 20 3d 20 30 2c 20 70 61 73 73 5f 6c 65 6e 20 3d   = 0, pass_len =
2210: 20 30 2c 20 64 6b 5f 6c 65 6e 20 3d 20 36 34 2c   0, dk_len = 64,
2220: 20 72 65 73 20 3d 20 54 43 4c 5f 4f 4b 2c 20 66   res = TCL_OK, f
2230: 6e 3b 0a 20 20 20 20 75 69 6e 74 36 34 5f 74 20  n;.    uint64_t 
2240: 4e 20 3d 20 30 2c 20 70 20 3d 20 30 2c 20 72 20  N = 0, p = 0, r 
2250: 3d 20 30 2c 20 6d 61 78 6d 65 6d 20 3d 20 30 3b  = 0, maxmem = 0;
2260: 0a 20 20 20 20 73 69 7a 65 5f 74 20 6f 75 74 5f  .    size_t out_
2270: 6c 65 6e 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  len;.    Tcl_Obj
2280: 20 2a 72 65 73 75 6c 74 4f 62 6a 3b 0a 0a 20 20   *resultObj;..  
2290: 20 20 64 70 72 69 6e 74 66 28 22 43 61 6c 6c 65    dprintf("Calle
22a0: 64 22 29 3b 0a 0a 20 20 20 20 2f 2a 20 43 6c 65  d");..    /* Cle
22b0: 61 72 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 20  ar errors */.   
22c0: 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
22d0: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 45 52  (interp);.    ER
22e0: 52 5f 63 6c 65 61 72 5f 65 72 72 6f 72 28 29 3b  R_clear_error();
22f0: 0a 0a 20 20 20 20 2f 2a 20 56 61 6c 69 64 61 74  ..    /* Validat
2300: 65 20 61 72 67 20 63 6f 75 6e 74 20 2a 2f 0a 20  e arg count */. 
2310: 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 35 20     if (objc < 5 
2320: 7c 7c 20 6f 62 6a 63 20 3e 20 31 33 29 20 7b 0a  || objc > 13) {.
2330: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67  .Tcl_WrongNumArg
2340: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2350: 76 2c 20 22 2d 70 61 73 73 77 6f 72 64 20 73 74  v, "-password st
2360: 72 69 6e 67 20 2d 73 61 6c 74 20 73 74 72 69 6e  ring -salt strin
2370: 67 20 3f 2d 4e 20 63 6f 73 74 50 61 72 61 6d 65  g ?-N costParame
2380: 74 65 72 3f 20 3f 2d 72 20 62 6c 6f 63 6b 53 69  ter? ?-r blockSi
2390: 7a 65 3f 20 3f 2d 70 20 70 61 72 61 6c 6c 65 6c  ze? ?-p parallel
23a0: 69 7a 61 74 69 6f 6e 3f 20 3f 2d 73 69 7a 65 20  ization? ?-size 
23b0: 64 65 72 69 76 65 64 5f 6c 65 6e 67 74 68 3f 22  derived_length?"
23c0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
23d0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
23e0: 20 2f 2a 20 47 65 74 20 6f 70 74 69 6f 6e 73 20   /* Get options 
23f0: 2a 2f 0a 20 20 20 20 66 6f 72 20 28 69 6e 74 20  */.    for (int 
2400: 69 64 78 20 3d 20 31 3b 20 69 64 78 20 3c 20 6f  idx = 1; idx < o
2410: 62 6a 63 3b 20 69 64 78 2b 2b 29 20 7b 0a 09 2f  bjc; idx++) {../
2420: 2a 20 47 65 74 20 6f 70 74 69 6f 6e 20 2a 2f 0a  * Get option */.
2430: 09 69 66 20 28 54 63 6c 5f 47 65 74 49 6e 64 65  .if (Tcl_GetInde
2440: 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  xFromObj(interp,
2450: 20 6f 62 6a 76 5b 69 64 78 5d 2c 20 63 6f 6d 6d   objv[idx], comm
2460: 61 6e 64 5f 6f 70 74 73 2c 20 22 6f 70 74 69 6f  and_opts, "optio
2470: 6e 22 2c 20 30 2c 20 26 66 6e 29 20 21 3d 20 54  n", 0, &fn) != T
2480: 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65  CL_OK) {..    re
2490: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
24a0: 09 7d 0a 0a 09 2f 2a 20 56 61 6c 69 64 61 74 65  .}.../* Validate
24b0: 20 61 72 67 20 68 61 73 20 61 20 76 61 6c 75 65   arg has a value
24c0: 20 2a 2f 0a 09 69 66 20 28 2b 2b 69 64 78 20 3e   */..if (++idx >
24d0: 3d 20 6f 62 6a 63 29 20 7b 0a 09 20 20 20 20 54  = objc) {..    T
24e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
24f0: 69 6e 74 65 72 70 2c 20 22 4e 6f 20 76 61 6c 75  interp, "No valu
2500: 65 20 66 6f 72 20 6f 70 74 69 6f 6e 20 5c 22 22  e for option \""
2510: 2c 20 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 5b 66  , command_opts[f
2520: 6e 5d 2c 20 22 5c 22 22 2c 20 28 63 68 61 72 20  n], "\"", (char 
2530: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72  *) NULL);..    r
2540: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2550: 0a 09 7d 0a 0a 09 73 77 69 74 63 68 28 66 6e 29  ..}...switch(fn)
2560: 20 7b 0a 09 63 61 73 65 20 5f 6f 70 74 5f 6b 65   {..case _opt_ke
2570: 79 3a 0a 09 63 61 73 65 20 5f 6f 70 74 5f 70 61  y:..case _opt_pa
2580: 73 73 77 6f 72 64 3a 0a 09 20 20 20 20 47 45 54  ssword:..    GET
2590: 5f 4f 50 54 5f 42 59 54 45 5f 41 52 52 41 59 28  _OPT_BYTE_ARRAY(
25a0: 6f 62 6a 76 5b 69 64 78 5d 2c 20 70 61 73 73 2c  objv[idx], pass,
25b0: 20 26 70 61 73 73 5f 6c 65 6e 29 3b 0a 09 20 20   &pass_len);..  
25c0: 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f    break;..case _
25d0: 6f 70 74 5f 73 61 6c 74 3a 0a 09 20 20 20 20 47  opt_salt:..    G
25e0: 45 54 5f 4f 50 54 5f 42 59 54 45 5f 41 52 52 41  ET_OPT_BYTE_ARRA
25f0: 59 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 73 61 6c  Y(objv[idx], sal
2600: 74 2c 20 26 73 61 6c 74 5f 6c 65 6e 29 3b 0a 09  t, &salt_len);..
2610: 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73 65      break;..case
2620: 20 5f 6f 70 74 5f 6c 65 6e 67 74 68 3a 0a 09 63   _opt_length:..c
2630: 61 73 65 20 5f 6f 70 74 5f 73 69 7a 65 3a 0a 09  ase _opt_size:..
2640: 20 20 20 20 69 66 20 28 55 74 69 6c 5f 47 65 74      if (Util_Get
2650: 49 6e 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Int(interp, objv
2660: 5b 69 64 78 5d 2c 20 26 64 6b 5f 6c 65 6e 2c 20  [idx], &dk_len, 
2670: 63 6f 6d 6d 61 6e 64 5f 6f 70 74 73 5b 66 6e 5d  command_opts[fn]
2680: 2c 20 31 2c 20 30 29 20 21 3d 20 54 43 4c 5f 4f  , 1, 0) != TCL_O
2690: 4b 29 20 7b 0a 09 09 67 6f 74 6f 20 65 72 72 6f  K) {...goto erro
26a0: 72 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 62  r;..    }..    b
26b0: 72 65 61 6b 3b 0a 09 63 61 73 65 20 5f 6f 70 74  reak;..case _opt
26c0: 5f 4e 3a 0a 09 63 61 73 65 20 5f 6f 70 74 5f 6e  _N:..case _opt_n
26d0: 3a 0a 09 20 20 20 20 47 45 54 5f 4f 50 54 5f 57  :..    GET_OPT_W
26e0: 49 44 45 28 6f 62 6a 76 5b 69 64 78 5d 2c 20 26  IDE(objv[idx], &
26f0: 4e 29 3b 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a  N);..    break;.
2700: 09 63 61 73 65 20 5f 6f 70 74 5f 72 3a 0a 09 20  .case _opt_r:.. 
2710: 20 20 20 47 45 54 5f 4f 50 54 5f 57 49 44 45 28     GET_OPT_WIDE(
2720: 6f 62 6a 76 5b 69 64 78 5d 2c 20 26 72 29 3b 0a  objv[idx], &r);.
2730: 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 63 61 73  .    break;..cas
2740: 65 20 5f 6f 70 74 5f 70 3a 0a 09 20 20 20 20 47  e _opt_p:..    G
2750: 45 54 5f 4f 50 54 5f 57 49 44 45 28 6f 62 6a 76  ET_OPT_WIDE(objv
2760: 5b 69 64 78 5d 2c 20 26 70 29 3b 0a 09 20 20 20  [idx], &p);..   
2770: 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20 7d   break;..}.    }
2780: 0a 0a 20 20 20 20 69 66 20 28 70 61 73 73 20 3d  ..    if (pass =
2790: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41  = NULL) {..Tcl_A
27a0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
27b0: 72 70 2c 20 22 6e 6f 20 70 61 73 73 77 6f 72 64  rp, "no password
27c0: 22 2c 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c  ", (char *) NULL
27d0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45  );..return TCL_E
27e0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
27f0: 20 69 66 20 28 73 61 6c 74 20 3d 3d 20 4e 55 4c   if (salt == NUL
2800: 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  L) {..Tcl_Append
2810: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2820: 6e 6f 20 73 61 6c 74 22 2c 20 28 63 68 61 72 20  no salt", (char 
2830: 2a 29 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72  *) NULL);..retur
2840: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
2850: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61 74   }..    /* Creat
2860: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20  e context */.   
2870: 20 70 63 74 78 20 3d 20 45 56 50 5f 50 4b 45 59   pctx = EVP_PKEY
2880: 5f 43 54 58 5f 6e 65 77 5f 69 64 28 45 56 50 5f  _CTX_new_id(EVP_
2890: 50 4b 45 59 5f 53 43 52 59 50 54 2c 20 4e 55 4c  PKEY_SCRYPT, NUL
28a0: 4c 29 3b 0a 20 20 20 20 69 66 20 28 70 63 74 78  L);.    if (pctx
28b0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c   == NULL) {..Tcl
28c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
28d0: 74 65 72 70 2c 20 22 4d 65 6d 6f 72 79 20 61 6c  terp, "Memory al
28e0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 22 2c  location error",
28f0: 20 28 63 68 61 72 20 2a 29 20 4e 55 4c 4c 29 3b   (char *) NULL);
2900: 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20  ..goto error;.  
2910: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 45 56 50    }..    if (EVP
2920: 5f 50 4b 45 59 5f 64 65 72 69 76 65 5f 69 6e 69  _PKEY_derive_ini
2930: 74 28 70 63 74 78 29 20 3c 20 31 29 20 7b 0a 09  t(pctx) < 1) {..
2940: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2950: 28 69 6e 74 65 72 70 2c 20 22 49 6e 69 74 69 61  (interp, "Initia
2960: 6c 69 7a 65 20 66 61 69 6c 65 64 3a 20 22 2c 20  lize failed: ", 
2970: 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b  REASON(), NULL);
2980: 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20  ..goto error;.  
2990: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20    }..    /* Set 
29a0: 63 6f 6e 66 69 67 20 70 61 72 61 6d 65 74 65 72  config parameter
29b0: 73 20 2a 2f 0a 20 20 20 20 69 66 20 28 45 56 50  s */.    if (EVP
29c0: 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 31 5f 70  _PKEY_CTX_set1_p
29d0: 62 65 5f 70 61 73 73 28 70 63 74 78 2c 20 70 61  be_pass(pctx, pa
29e0: 73 73 2c 20 70 61 73 73 5f 6c 65 6e 29 20 3c 20  ss, pass_len) < 
29f0: 31 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64  1) {..Tcl_Append
2a00: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2a10: 53 65 74 20 6b 65 79 20 66 61 69 6c 65 64 3a 20  Set key failed: 
2a20: 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c  ", REASON(), NUL
2a30: 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72 6f 72 3b  L);..goto error;
2a40: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 45  .    }.    if (E
2a50: 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 31  VP_PKEY_CTX_set1
2a60: 5f 73 63 72 79 70 74 5f 73 61 6c 74 28 70 63 74  _scrypt_salt(pct
2a70: 78 2c 20 73 61 6c 74 2c 20 73 61 6c 74 5f 6c 65  x, salt, salt_le
2a80: 6e 29 20 3c 20 31 29 20 7b 0a 09 54 63 6c 5f 41  n) < 1) {..Tcl_A
2a90: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2aa0: 72 70 2c 20 22 53 65 74 20 73 61 6c 74 20 66 61  rp, "Set salt fa
2ab0: 69 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28  iled: ", REASON(
2ac0: 29 2c 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20  ), NULL);..goto 
2ad0: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20  error;.    }.   
2ae0: 20 69 66 20 28 4e 20 21 3d 20 30 20 26 26 20 45   if (N != 0 && E
2af0: 56 50 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f  VP_PKEY_CTX_set_
2b00: 73 63 72 79 70 74 5f 4e 28 70 63 74 78 2c 20 4e  scrypt_N(pctx, N
2b10: 29 20 3c 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70  ) < 1) {..Tcl_Ap
2b20: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2b30: 70 2c 20 22 53 65 74 20 63 6f 73 74 20 70 61 72  p, "Set cost par
2b40: 61 6d 65 74 65 72 20 28 4e 29 20 66 61 69 6c 65  ameter (N) faile
2b50: 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20  d: ", REASON(), 
2b60: 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65 72 72  NULL);..goto err
2b70: 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  or;.    }.    if
2b80: 20 28 72 20 21 3d 20 30 20 26 26 20 45 56 50 5f   (r != 0 && EVP_
2b90: 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 73 63 72  PKEY_CTX_set_scr
2ba0: 79 70 74 5f 72 28 70 63 74 78 2c 20 72 29 20 3c  ypt_r(pctx, r) <
2bb0: 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e   1) {..Tcl_Appen
2bc0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2bd0: 22 53 65 74 20 6c 6f 63 6b 20 73 69 7a 65 20 70  "Set lock size p
2be0: 61 72 61 6d 65 74 65 72 20 28 72 29 20 66 61 69  arameter (r) fai
2bf0: 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28 29  led: ", REASON()
2c00: 2c 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20 65  , NULL);..goto e
2c10: 72 72 6f 72 3b 0a 20 20 20 7d 0a 20 20 20 20 69  rror;.   }.    i
2c20: 66 20 28 70 20 21 3d 20 30 20 26 26 20 45 56 50  f (p != 0 && EVP
2c30: 5f 50 4b 45 59 5f 43 54 58 5f 73 65 74 5f 73 63  _PKEY_CTX_set_sc
2c40: 72 79 70 74 5f 70 28 70 63 74 78 2c 20 70 29 20  rypt_p(pctx, p) 
2c50: 3c 20 31 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65  < 1) {..Tcl_Appe
2c60: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2c70: 20 22 53 65 74 20 50 61 72 61 6c 6c 65 6c 69 7a   "Set Paralleliz
2c80: 61 74 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 20  ation parameter 
2c90: 28 70 29 20 66 61 69 6c 65 64 3a 20 22 2c 20 52  (p) failed: ", R
2ca0: 45 41 53 4f 4e 28 29 2c 20 4e 55 4c 4c 29 3b 0a  EASON(), NULL);.
2cb0: 09 67 6f 74 6f 20 65 72 72 6f 72 3b 0a 20 20 20  .goto error;.   
2cc0: 20 7d 0a 20 20 20 20 69 66 20 28 6d 61 78 6d 65   }.    if (maxme
2cd0: 6d 20 21 3d 20 30 20 26 26 20 45 56 50 5f 50 4b  m != 0 && EVP_PK
2ce0: 45 59 5f 43 54 58 5f 73 65 74 5f 73 63 72 79 70  EY_CTX_set_scryp
2cf0: 74 5f 6d 61 78 6d 65 6d 5f 62 79 74 65 73 28 70  t_maxmem_bytes(p
2d00: 63 74 78 2c 20 6d 61 78 6d 65 6d 29 20 3c 20 31  ctx, maxmem) < 1
2d10: 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 52  ) {..Tcl_AppendR
2d20: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 53  esult(interp, "S
2d30: 65 74 20 6d 61 78 20 6d 65 6d 6f 72 79 20 66 61  et max memory fa
2d40: 69 6c 65 64 3a 20 22 2c 20 52 45 41 53 4f 4e 28  iled: ", REASON(
2d50: 29 2c 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f 20  ), NULL);..goto 
2d60: 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  error;.    }..  
2d70: 20 20 2f 2a 20 47 65 74 20 62 75 66 66 65 72 20    /* Get buffer 
2d80: 2a 2f 0a 20 20 20 20 72 65 73 75 6c 74 4f 62 6a  */.    resultObj
2d90: 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b   = Tcl_NewObj();
2da0: 0a 20 20 20 20 69 66 20 28 28 6f 75 74 20 3d 20  .    if ((out = 
2db0: 54 63 6c 5f 53 65 74 42 79 74 65 41 72 72 61 79  Tcl_SetByteArray
2dc0: 4c 65 6e 67 74 68 28 72 65 73 75 6c 74 4f 62 6a  Length(resultObj
2dd0: 2c 20 64 6b 5f 6c 65 6e 29 29 20 3d 3d 20 4e 55  , dk_len)) == NU
2de0: 4c 4c 29 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e  LL) {..Tcl_Appen
2df0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2e00: 22 4d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69  "Memory allocati
2e10: 6f 6e 20 65 72 72 6f 72 22 2c 20 28 63 68 61 72  on error", (char
2e20: 20 2a 29 20 4e 55 4c 4c 29 3b 0a 09 67 6f 74 6f   *) NULL);..goto
2e30: 20 65 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 20 20   error;.    }.  
2e40: 20 20 6f 75 74 5f 6c 65 6e 20 3d 20 28 73 69 7a    out_len = (siz
2e50: 65 5f 74 29 20 64 6b 5f 6c 65 6e 3b 0a 0a 20 20  e_t) dk_len;..  
2e60: 20 20 2f 2a 20 44 65 72 69 76 65 20 6b 65 79 20    /* Derive key 
2e70: 2a 2f 0a 20 20 20 20 69 66 20 28 45 56 50 5f 50  */.    if (EVP_P
2e80: 4b 45 59 5f 64 65 72 69 76 65 28 70 63 74 78 2c  KEY_derive(pctx,
2e90: 20 6f 75 74 2c 20 26 6f 75 74 5f 6c 65 6e 29 20   out, &out_len) 
2ea0: 3e 20 30 29 20 7b 0a 09 2f 2a 20 53 68 72 69 6e  > 0) {../* Shrin
2eb0: 6b 20 62 75 66 66 65 72 20 74 6f 20 61 63 74 75  k buffer to actu
2ec0: 61 6c 20 73 69 7a 65 20 2a 2f 0a 09 54 63 6c 5f  al size */..Tcl_
2ed0: 53 65 74 42 79 74 65 41 72 72 61 79 4c 65 6e 67  SetByteArrayLeng
2ee0: 74 68 28 72 65 73 75 6c 74 4f 62 6a 2c 20 28 69  th(resultObj, (i
2ef0: 6e 74 29 20 6f 75 74 5f 6c 65 6e 29 3b 0a 09 54  nt) out_len);..T
2f00: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
2f10: 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62  interp, resultOb
2f20: 6a 29 3b 0a 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a  j);..goto done;.
2f30: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54  .    } else {..T
2f40: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2f50: 69 6e 74 65 72 70 2c 20 22 4b 65 79 20 64 65 72  interp, "Key der
2f60: 69 76 61 74 69 6f 6e 20 66 61 69 6c 65 64 3a 20  ivation failed: 
2f70: 22 2c 20 52 45 41 53 4f 4e 28 29 2c 20 4e 55 4c  ", REASON(), NUL
2f80: 4c 29 3b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66  L);..Tcl_DecrRef
2f90: 43 6f 75 6e 74 28 72 65 73 75 6c 74 4f 62 6a 29  Count(resultObj)
2fa0: 3b 0a 20 20 20 20 7d 0a 0a 65 72 72 6f 72 3a 0a  ;.    }..error:.
2fb0: 20 20 20 20 72 65 73 20 3d 20 54 43 4c 5f 45 52      res = TCL_ER
2fc0: 52 4f 52 3b 0a 0a 64 6f 6e 65 3a 0a 20 20 20 20  ROR;..done:.    
2fd0: 69 66 20 28 70 63 74 78 20 21 3d 20 4e 55 4c 4c  if (pctx != NULL
2fe0: 29 20 7b 0a 09 45 56 50 5f 50 4b 45 59 5f 43 54  ) {..EVP_PKEY_CT
2ff0: 58 5f 66 72 65 65 28 70 63 74 78 29 3b 0a 20 20  X_free(pctx);.  
3000: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
3010: 65 73 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  es;.}../*. *----
3020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
3060: 20 2a 0a 20 2a 20 54 6c 73 5f 4b 65 79 43 6f 6d   *. * Tls_KeyCom
3070: 6d 61 6e 64 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43  mands --. *. *.C
3080: 72 65 61 74 65 20 6b 65 79 20 63 6f 6d 6d 61 6e  reate key comman
3090: 64 73 0a 20 2a 0a 20 2a 20 52 65 74 75 72 6e 73  ds. *. * Returns
30a0: 3a 0a 20 2a 09 54 43 4c 5f 4f 4b 20 6f 72 20 54  :. *.TCL_OK or T
30b0: 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 20 53  CL_ERROR. *. * S
30c0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
30d0: 43 72 65 61 74 65 73 20 63 6f 6d 6d 61 6e 64 73  Creates commands
30e0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
30f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3100: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 69 6e  ---------. */.in
3130: 74 20 54 6c 73 5f 4b 65 79 43 6f 6d 6d 61 6e 64  t Tls_KeyCommand
3140: 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  s(Tcl_Interp *in
3150: 74 65 72 70 29 20 7b 0a 20 20 20 20 54 63 6c 5f  terp) {.    Tcl_
3160: 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64  CreateObjCommand
3170: 28 69 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 68  (interp, "tls::h
3180: 6b 64 66 22 2c 20 4b 44 46 5f 48 4b 44 46 2c 20  kdf", KDF_HKDF, 
3190: 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30 2c 20  (ClientData) 0, 
31a0: 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65 50 72  (Tcl_CmdDeletePr
31b0: 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20 20 20  oc *) NULL);.   
31c0: 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
31d0: 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 22 74  mmand(interp, "t
31e0: 6c 73 3a 3a 70 62 6b 64 66 32 22 2c 20 4b 44 46  ls::pbkdf2", KDF
31f0: 5f 50 42 4b 44 46 32 2c 20 28 43 6c 69 65 6e 74  _PBKDF2, (Client
3200: 44 61 74 61 29 20 30 2c 20 28 54 63 6c 5f 43 6d  Data) 0, (Tcl_Cm
3210: 64 44 65 6c 65 74 65 50 72 6f 63 20 2a 29 20 4e  dDeleteProc *) N
3220: 55 4c 4c 29 3b 0a 20 20 20 20 54 63 6c 5f 43 72  ULL);.    Tcl_Cr
3230: 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69  eateObjCommand(i
3240: 6e 74 65 72 70 2c 20 22 74 6c 73 3a 3a 73 63 72  nterp, "tls::scr
3250: 79 70 74 22 2c 20 4b 44 46 5f 53 63 72 79 70 74  ypt", KDF_Scrypt
3260: 2c 20 28 43 6c 69 65 6e 74 44 61 74 61 29 20 30  , (ClientData) 0
3270: 2c 20 28 54 63 6c 5f 43 6d 64 44 65 6c 65 74 65  , (Tcl_CmdDelete
3280: 50 72 6f 63 20 2a 29 20 4e 55 4c 4c 29 3b 0a 20  Proc *) NULL);. 
3290: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b     return TCL_OK
32a0: 3b 0a 7d 0a 0a                                   ;.}..